awk -v RS= -v cmd=sort '{print | cmd; close(cmd); print ""}' file
Wenn Sie das Datensatztrennzeichen RSauf eine leere Zeichenfolge setzen, wird in Absätzen jeweils ein Schritt ausgeführt. $0Leiten 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 splitdas um \n\n(Absätze). foreach„Absatz“, sortdie Linien durch splitting um Zeilenumbrüche, sorting und dann joinsie 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).
awkLösung, die densortOverhead vermeidet ! Hinterhältig!