Bash: Text Datei sortieren, die Zeile mit "#" raute als Ausschlag gebendes Element für Sortierung.

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
ren22

Bash: Text Datei sortieren, die Zeile mit "#" raute als Ausschlag gebendes Element für Sortierung.

Beitrag von ren22 » 21.04.2019 03:58:10

Hallo,

wie kann man eine Textdatei , mit Bash, so sortieren, wenn folgender Inhalt gegeben ist:

Code: Alles auswählen

#hans_03
kurz
00:01:17:11
1555803656

#werner_04
kurz
00:03:36:34
1555803658

#emil_03
kurz
00:01:47:16
1555803665
und die Ausgabe zu Ende so sortiert sein soll:

Code: Alles auswählen

#emil_03
kurz
00:01:47:16
1555803665

#hans_03
kurz
00:01:17:11
1555803656

#werner_04
kurz
00:03:36:34
1555803658
Im Grungegenommen soll immer die Zeile mit der raute "#" das Ausschlaggebende Element bei der Sortierung sein, so das die 4 Zeilen

Code: Alles auswählen

#emil_03
kurz
00:01:47:16
1555803665
auch immer zusammen bleiben.

Danke

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Bash: Text Datei sortieren, die Zeile mit "#" raute als Ausschlag gebendes Element für Sortierung.

Beitrag von Meillo » 21.04.2019 09:46:04

sort(1) arbeitet *zeilenweise*, damit kannst du die von dir gewuenschte Sortierung nicht direkt realisieren.

Du hast zwei Moeglichkeiten:

(1) Du verbindest die Zeilen der Bloecke mittels eindeutiger Trennzeichen (z.B. Tab) miteinander, damit du nur noch drei *Zeilen* hast (die jede vier Felder hat), dann kannst du sie mit sort(1) sortieren. Anschliessend musst du die Trennzeichen wieder in Newlines umwandeln.

(2) Du liest die Datei mit awk, Perl, o.ae. ein, welches Records nicht nur zeilenweise bilden kann. Die Sortierung machst du dann mit internen Mitteln der jeweiligen Sprache.



Eine moegliche Umsetzung von (1):

Code: Alles auswählen

<INPUTFILE awk 'BEGIN{RS=""; OFS="\t"} {NF=NF; print;}' |
        sort |
	awk 'BEGIN{ORS="\n\n"; OFS="\n"} {NF=NF; print;}'
Awk formt dabei die Record-Bloecke zu Zeilen um und umgekehrt (`NF=NF' sorgt dafuer, dass OFS verwendet wird).
Use ed once in a while!

Antworten