Ich glaube, ich bin jetzt ziemlich erfahren darin, nach Spalten zu sortieren . Bisher habe ich jedoch noch nichts zum Sortieren fortlaufender Zeilen gefunden .
Angenommen, wir haben eine Textdatei, die so aussieht: (natürlich sehr vereinfacht)
Echo
Alpha
Delta
Charlie
Golf
Bravo
Hotel
Foxtrot
Ist es nun möglich, die Zeilen für jeden Block einzeln alphanumerisch zu sortieren ? Ich meine, damit das Ergebnis so aussieht:
Alpha
Charlie
Delta
Echo
Bravo
Foxtrot
Golf
Hotel
Nach dem, was ich in der sort
Manpage gefunden habe, ist dies mit dem integrierten UNIX- sort
Befehl möglicherweise nicht möglich . Oder ist dies sogar möglich, ohne auf externe Tools / Tools von Drittanbietern zurückgreifen zu müssen?
quelle
awk
Lösung, die densort
Overhead vermeidet ! Hinterhältig!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 eingestelltsort
) und drucken Sie die Ausgabe. Drucken Sie eine leere Zeile aus, um die ausgegebenen Absätze durch a zu trennenprint ""
.Wenn wir Perl-Beispiele geben, dann präsentiere ich einen alternativen Ansatz als den von Stephane:
Deaktivieren Sie das Feldtrennzeichen (
undef $/
), damit wir<>
STDIN verwenden und abrufen können. Wir haben dannsplit
das um\n\n
(Absätze).foreach
„Absatz“,sort
die Linien durchsplit
ting um Zeilenumbrüche,sort
ing und dannjoin
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:
Dies weist die Absätze zu
@list
, und dann gibt es eine "ternäre Operation", um zu überprüfen, ob es das letzte Element derforeach
(der\$_ == \$list[-1]
Prüfung) ist. print""
wenn es (? ...
) ist, else (: ...
) print"\n"
für alle anderen "Absätze" (Elemente von@list
).quelle
/usr/bin/sort
mit dieser Zeile auf oder handelt es sich um einenawk
integrierten "Sortier" -Befehl?Ich habe ein Tool in haskell geschrieben, mit dem Sie sort, shuf, tac oder einen anderen Befehl für Textabschnitte verwenden können.
https://gist.github.com/siers/01306a361c22f2de0122
BEARBEITEN: Das Tool ist auch in diesem Repo enthalten: https://github.com/siers/haskell-import-sort
Es teilt den Text in Blöcke auf, verbindet die Unterblöcke mit
\0
char, leitet den Befehl weiter und macht schließlich das Gleiche in umgekehrter Reihenfolge.28-08-2015 : Ich habe einen anderen persönlichen Gebrauch für dieses Tool gefunden - N Absätze nach einer Zeile auswählen.
quelle
Wenn Sie GNU awk zur Verfügung haben, können Sie jeden Block mit der integrierten
asort()
Funktion sortieren . Etwas wie das:blocksort.awk
Führen Sie es so aus:
quelle
TXR Lisp Schritt für Schritt:
Referenzen: get-lines , partition * , op , where , chain , length , zerop , mapcar , interpose .
quelle
[mapcar sort ...]
wir in dersort
durch eine Funktion ersetzen könnten, die die Zeichenfolgen durch einen externen Prozess leitet. Wir können dann ein Werkzeug zum Verteilen eines externen Textverarbeitungsbefehls über Absätze erhalten.