awk -v RS= -v cmd=sort '{print | cmd; close(cmd); print ""}' file
Wenn Sie das Datensatztrennzeichen RS
auf eine leere Zeichenfolge setzen, wird in Absätzen jeweils ein Schritt ausgeführt. $0
Leiten Sie für jeden Absatz den Absatz (in ) an cmd (auf eingestellt sort
) und drucken Sie die Ausgabe. Drucken Sie eine leere Zeile aus, um die ausgegebenen Absätze durch a zu trennen print ""
.
Wenn wir Perl-Beispiele geben, dann präsentiere ich einen alternativen Ansatz als den von Stephane:
perl -e 'undef $/; print join "\n", sort (split /\n/), "\n"
foreach(split(/\n\n/, <>))' < file
Deaktivieren Sie das Feldtrennzeichen ( undef $/
), damit wir <>
STDIN verwenden und abrufen können. Wir haben dann split
das um \n\n
(Absätze). foreach
„Absatz“, sort
die Linien durch split
ting um Zeilenumbrüche, sort
ing und dann join
sie ing wieder zusammen und auf einem hinteren anheftet \n
.
Dies hat jedoch einen Nebeneffekt beim Hinzufügen eines Trennzeichens "nachfolgender Absätze" zum letzten Absatz (falls noch kein Trennzeichen vorhanden war). Sie können das mit dem etwas weniger hübschen umgehen:
perl -e 'undef $/; print join "\n", sort (split /\n/) , (\$_ == \$list[-1] ? "" : "\n")
foreach(@list = split(/\n\n/, <>))' < file
Dies weist die Absätze zu @list
, und dann gibt es eine "ternäre Operation", um zu überprüfen, ob es das letzte Element der foreach
(der \$_ == \$list[-1]
Prüfung) ist. print ""
wenn es ( ? ...
) ist, else ( : ...
) print "\n"
für alle anderen "Absätze" (Elemente von @list
).
awk
Lösung, die densort
Overhead vermeidet ! Hinterhältig!