Ich habe eine Felddatei mit fester Breite, die ich mit dem UNIX-Sortierdienstprogramm (in meinem Fall Cygwin) sortieren möchte.
Das Problem ist, dass sich am oberen Rand der Datei ein zweizeiliger Header befindet, der am unteren Rand der Datei sortiert wird (da jede Headerzeile mit einem Doppelpunkt beginnt).
Gibt es eine Möglichkeit, die Sortierung anzugeben, entweder "die ersten beiden Zeilen über unsortiert zu übergeben" oder eine Reihenfolge anzugeben, in der die Doppelpunktzeilen nach oben sortiert werden - die verbleibenden Zeilen beginnen immer mit einer 6-stelligen Ziffer (was eigentlich der Schlüssel I ist) sortiere weiter) wenn das hilft.
Beispiel:
:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
500123TSTMY_RADAR00
222334NOTALINEOUT01
477821USASHUTTLES21
325611LVEANOTHERS00
sollte sortieren nach:
:0:12345
:1:6:2:3:8:4:2
010005TSTDOG_FOOD01
222334NOTALINEOUT01
325611LVEANOTHERS00
477821USASHUTTLES21
500123TSTMY_RADAR00
unix
sorting
command-line
Rob Gilliam
quelle
quelle
Antworten:
Die Klammern erstellen eine Unterschale, die das Standardout so umschließt, dass Sie es weiterleiten oder umleiten können, als ob es von einem einzelnen Befehl stammt.
quelle
tee >(head -n $header_size) | tail -n +$header_size | sort
, aber der Kopf scheint hinter dertail|sort
Pipe herzulaufen, sodass der Header am Ende gedruckt wird. Ist das deterministisch oder eine Rassenbedingung?cat
das stdin in eine temporäre Datei umleiten und dann den obigen Befehl für diese neue Datei ausführen, aber es wird langsam hässlich genug, dass es wahrscheinlich besser ist, eine der in awk basierten Lösungen zu verwenden die anderen Antworten.Wenn es Ihnen nichts ausmacht
awk
, können Sie dieawk
integrierten Pipe-Fähigkeiten nutzenz.B.
Dies druckt die ersten beiden Zeilen wörtlich und leitet den Rest durch
sort
.Beachten Sie, dass dies den ganz besonderen Vorteil hat, dass Teile eines Piping-Eingangs selektiv sortiert werden können. Alle anderen vorgeschlagenen Methoden sortieren nur einfache Dateien, die mehrfach gelesen werden können. Das funktioniert bei allem.
quelle
$0
,print
ist genug.Hier ist eine Version, die mit weitergeleiteten Daten arbeitet:
Wenn Ihre Kopfzeile mehrere Zeilen enthält:
Diese Lösung ist von hier
quelle
extract_data | (read h; echo "$h"; sort)
er kurz genug, um sich zu erinnern. Ihr Beispiel deckt mehr Randfälle ab. :) Das ist die beste Antwort. arbeitet an Rohren. nein awk.extract_data | (read; sort)
In einfachen Fällen
sed
kann die Arbeit elegant erledigt werden:oder gleichwertig,
Der Schlüssel befindet sich in der
1q
ersten Zeile (Kopfzeile) und wird beendet (der Rest der Eingabe bleibt erhaltensort
).Für das gegebene Beispiel
2q
wird der Trick tun.Der
-u
Schalter (ungepuffert) ist für diejenigensed
s (insbesondere GNUs ) erforderlich , die ansonsten die Eingabe in Blöcken lesen würden, wodurch Daten verbraucht würden, die Siesort
stattdessen durchlaufen möchten .quelle
Sie können verwenden
tail -n +3 <file> | sort ...
(tail gibt den Dateiinhalt aus der 3. Zeile aus).quelle
Beispiel:
quelle
Es werden nur 2 Codezeilen benötigt ...
Für numerische Daten ist -n erforderlich. Für die Alpha-Sortierung ist -n nicht erforderlich.
Beispieldatei:
$ cat test.txt
Ergebnis:
$ cat a.tmp
quelle
Hier ist also eine Bash-Funktion, bei der Argumente genau wie Sortieren sind. Unterstützende Dateien und Pipes.
Wie es funktioniert. Diese Zeile prüft, ob mindestens ein Argument vorhanden ist und ob das letzte Argument eine Datei ist.
Dadurch wird die Datei in einem separaten Argument gespeichert. Da sind wir dabei, das letzte Argument zu löschen.
Hier entfernen wir das letzte Argument. Da wollen wir es nicht als Sortierargument übergeben.
Schließlich machen wir den awk-Teil und übergeben die Argumente (abzüglich des letzten Arguments, wenn es sich um die Datei handelt), um in awk zu sortieren. Dies wurde ursprünglich von Dave vorgeschlagen und geändert, um Sortierargumente aufzunehmen. Wir verlassen uns auf die Tatsache, dass
$file
diese leer sind, wenn wir Rohrleitungen verwenden, und daher ignoriert werden.Beispiel für die Verwendung mit einer durch Kommas getrennten Datei.
quelle
Mit Python:
quelle
Hier ist eine Bash-Shell-Funktion, die aus den anderen Antworten abgeleitet wurde. Es behandelt sowohl Dateien als auch Pipes. Das erste Argument ist der Dateiname oder '-' für stdin. Verbleibende Argumente werden an sort übergeben. Ein paar Beispiele:
Die Shell-Funktion:
quelle
Dies ist die gleiche Antwort wie Ian Sherbin, aber meine Implementierung lautet:
quelle
Dies wird tun, was Sie wollen.
quelle