Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
joe2017
- Beiträge: 1274
- Registriert: 07.08.2017 14:29:51
Beitrag
von joe2017 » 31.10.2024 13:01:10
Hallo zusammen,
wahrscheinlich ist es ganz einfach, aber ich finde nichts zu dem Thema.
Ich hab eine Datei die wie folgt aufgebaut ist:
Code: Alles auswählen
hans;maier;abc;online;date
jürgen;staab;abc;offline;date
marc;fritz;abc;online;date
franz;müller;abc;online;date
steffan;müller;abc;offline;date
fritz;glaab;abc;online;date
Ich möchte die Datei so sortieren, dass die zeilen mit offline immer oben stehen.
Wie kann ich das am einfachsten realisieren?
VIelen Dank!
Zuletzt geändert von
joe2017 am 06.11.2024 11:56:20, insgesamt 3-mal geändert.
-
joe2017
- Beiträge: 1274
- Registriert: 07.08.2017 14:29:51
Beitrag
von joe2017 » 31.10.2024 14:29:28
Super!
Kann ich das auch dirkt in der aktuellen Datei sortieren? Oder muss ich das in eine neue Datei schreiben?
-
heisenberg
- Beiträge: 4123
- Registriert: 04.06.2015 01:17:27
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von heisenberg » 31.10.2024 14:48:01
Das geht mit
sponge aus
moreutils:
Code: Alles auswählen
$ whatis sponge
sponge (1) - soak up standard input and write to a file
Zuletzt geändert von
heisenberg am 31.10.2024 14:50:30, insgesamt 1-mal geändert.
-
Meillo
- Moderator
- Beiträge: 9241
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 31.10.2024 14:49:59
joe2017 hat geschrieben: 31.10.2024 14:29:28
Kann ich das auch dirkt in der aktuellen Datei sortieren? Oder muss ich das in eine neue Datei schreiben?
Bei sort(1) geht das ausnahmeweise, da sort(1) zuerst den kompletten Input lesen muss bevor es die Ausgabe schreibt. Siehe dazu die Option `-o'.
Wichtig: *Keinesfalls* die Ausgabe mit `>' umleiten, weil die Ausgabeumleitung von der Shell ausgefuehrt wird *bevor* das Programm gestartet wird. Wenn man es so macht, verliert man die Datei.
Use ed once in a while!
-
Meillo
- Moderator
- Beiträge: 9241
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 31.10.2024 14:51:22
Generell gesprochen ist das so, aber bei sort(1) geht es auch ohne, was an der spezifischen Arbeitsweise von sort(1) liegt -- es liest erst allen Input bevor es den ersten Output schreibt.
Use ed once in a while!
-
tobo
- Beiträge: 2346
- Registriert: 10.12.2008 10:51:41
Beitrag
von tobo » 01.11.2024 10:13:15
Soll die Sortierung auf das 4. Feld (on/offline) beschränkt sein und ansonsten die Reihenfolge unverändert bleiben (stabile Sortierung), dann so was:
-
joe2017
- Beiträge: 1274
- Registriert: 07.08.2017 14:29:51
Beitrag
von joe2017 » 04.11.2024 15:44:54
Ich habe die Sortierung in eine zweite Datei geschrieben und die alte anschließend ausgetauscht.
Vielen Dank auf jeden fall!
-
joe2017
- Beiträge: 1274
- Registriert: 07.08.2017 14:29:51
Beitrag
von joe2017 » 06.11.2024 10:00:04
Noch eine kleine Frage.
Ich hab folgende Syntax zum sortieren verwendet:
Das funktioniert auch bestens.
Kann man auch nach mehreren Spaltn sortieren? Sortieren nach spalte 3 und anschließend nach Spalte 4.
Ich habe das in zwei steps gemacht und hier wird nicht saubr sortiert.
Die Sortirung nach Spalte 3 funktioniert. Wenn ich anschließnd nach spalte 4 sortiere wird die Spalte 3 wieder durchgewürfelt.
-
Meillo
- Moderator
- Beiträge: 9241
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 06.11.2024 10:11:01
joe2017 hat geschrieben: 06.11.2024 10:00:04
Ich hab folgende Syntax zum sortieren verwendet:
Das funktioniert auch bestens.
Allerdings sortiert es genau genommen nicht nach Spalte 4, sondern nach ``Spalte 4 is zum Ende der Zeile''. Wenn du nur nach Spalte 4 Sortieren willst, dann musst du `-k4,4' verwenden.
joe2017 hat geschrieben: 06.11.2024 10:00:04
Kann man auch nach mehreren Spaltn sortieren? Sortieren nach spalte 3 und anschließend nach Spalte 4.
So:
Btw: Du kannst an die Sortierfelder jeweils auch noch `n' oder `r' anhaengen, um sie numerisch oder absteigend zu sortieren.
Use ed once in a while!
-
joe2017
- Beiträge: 1274
- Registriert: 07.08.2017 14:29:51
Beitrag
von joe2017 » 06.11.2024 11:04:28
Also ich habe es mit folgendem getestet. leider wird nicht nach Spalte 4 sortiert.
-
tobo
- Beiträge: 2346
- Registriert: 10.12.2008 10:51:41
Beitrag
von tobo » 06.11.2024 11:17:00
joe2017 hat geschrieben: 06.11.2024 11:04:28
Also ich habe es mit folgendem getestet. leider wird nicht nach Spalte 4 sortiert.
Doch - erst nach 3, dann nach 4:
Code: Alles auswählen
$ echo -e "a;1;2;5\nb;1;2;1\nc;1;2;4\nd;1;2;2\ne;1;2;3\nf;1;1;2\ng;1;1;1" | sort -t";" -k3,3 -k4,4
g;1;1;1
f;1;1;2
b;1;2;1
d;1;2;2
e;1;2;3
c;1;2;4
a;1;2;5
$
-
joe2017
- Beiträge: 1274
- Registriert: 07.08.2017 14:29:51
Beitrag
von joe2017 » 06.11.2024 11:28:22
Meine Datei Sieht wie folgt aus:
Code: Alles auswählen
a1;b;1;online;c
a2;b;2;online;c
a3;b;1;offline;c
a4;b;3;online;c
a5;b;5;online;c
a6;b;4;offline;c
a7;b;1;online;c
a8;b;2;online;c
a9;b;1;online;c
Ich möchte das diese so sortiert wird:
Code: Alles auswählen
a3;b;1;offline;c
a6;b;4;offline;c
a1;b;1;online;c
a7;b;1;online;c
a9;b;1;online;c
a2;b;2;online;c
a8;b;2;online;c
a4;b;3;online;c
a5;b;5;online;c
Also zu erst die 4 Spalte, dann die zweite Spalte und zuletzt die 1 Spalte
Das funktioniert nicht:
-
tobo
- Beiträge: 2346
- Registriert: 10.12.2008 10:51:41
Beitrag
von tobo » 06.11.2024 11:33:10
Du hast die Spalten verwechselt (nicht 4,2,1 sondern 4,3,1):
Code: Alles auswählen
$ sort -t";" -k4,4 -k3,3 -k1,1 f
a3;b;1;offline;c
a6;b;4;offline;c
a1;b;1;online;c
a7;b;1;online;c
a9;b;1;online;c
a2;b;2;online;c
a8;b;2;online;c
a4;b;3;online;c
a5;b;5;online;c
$
-
joe2017
- Beiträge: 1274
- Registriert: 07.08.2017 14:29:51
Beitrag
von joe2017 » 06.11.2024 11:36:48
ich hab es erfolgreich mit folgendem Befehl erfolgreich getestet:
Code: Alles auswählen
sort -t ";" -k 4b,4 -k 3,3 -k 1,1 liste.txt > liste2.txt
-
joe2017
- Beiträge: 1274
- Registriert: 07.08.2017 14:29:51
Beitrag
von joe2017 » 06.11.2024 11:37:48
tobo hat geschrieben: 06.11.2024 11:33:10
Du hast die Spalten verwechselt (nicht 4,2,1 sondern 4,3,1):
Mein Fehler
Ich meine Spalte 4, Spalte 3, Spalte 1