So sortieren Sie eine Datei an Ort und Stelle

205

Wenn wir den sort fileBefehl verwenden, zeigt die Datei ihren Inhalt sortiert an. Was ist, wenn ich keine Ausgabe außer einer sortierten Datei erhalten möchte?

Ali Sajid
quelle
Bitte aktualisieren Sie Ihre Frage, um klar zu erklären, was Sie mit dem Ergebnis des Sortierens der Datei tun möchten. Möchten Sie es an Ort und Stelle sortieren und den unsortierten Inhalt von filedurch den sortierten Inhalt derselben Datei ersetzen ? Die Art und Weise, wie Ihre Frage aktuell gestellt wird und überhaupt nichts tut, ist eine richtige Antwort (Sie möchten keine Ausgabe, also tun Sie nichts).
Keith Thompson
@KeithThompson Vielen Dank für Ihre Besorgnis. Ich habe versucht, eine Datei zu sortieren, möchte aber die Ausgabe auf dem Bildschirm vermeiden.
Ali Sajid
Wohin soll die Ausgabe gehen? In eine neue Datei? In die Originaldatei? Zum Drucker den Flur hinunter?
Keith Thompson
1
In die Originalakte
Ali Sajid
sort infile >outfileWenn Sie es ausführen , wird die sortierte Ausgabe in die Datei "outfile" übertragen. Dann können Sie die ursprüngliche "Infile" löschen und alles wird in Ordnung sein.
Luis Colorado

Antworten:

406

Sie können die Dateiumleitung verwenden, um die sortierte Ausgabe umzuleiten:

sort input-file > output_file

Oder Sie können die verwenden -o, --output=FILEOption sortieren , um anzuzeigen , die gleiche Eingabe- und Ausgabedatei:

sort -o file file

Hinweis: Ein häufiger Fehler besteht darin, zu versuchen, die Ausgabe in dieselbe Eingabedatei umzuleiten (z sort file > file. B. ). Dies funktioniert nicht, da die Shell die Umleitungen (nicht das Programm sort (1)) vornimmt und die Eingabedatei (da sie auch die Ausgabe ist) gelöscht wird, bevor das Programm sort (1) die Möglichkeit erhält, sie zu lesen.

Sylvain Bugat
quelle
87
Gute Anmerkung zum häufigen Fehler
Drakes
1
Dies ist sehr praktisch, wenn Sie Wörterbücher für LaTeX, +1
Bryson S.
6
Nur um die Bedeutung der Ordnung zu erwähnen. Von der GNU sortInfoseite: -o OUTPUT-FILE' --output = OUTPUT-FILE 'Schreibe die Ausgabe anstelle der Standardausgabe in die OUTPUT-FILE. Auf neueren Systemen wird POSIXLY_CORRECT 'vor Eingabedateien -o' cannot appear after an input file if gesetzt, z. B. sort F -o F'. Portable scripts should specify -o OUTPUT-FILE'.
Yassine ElBadaoui
14
Um zu vermeiden, dass der Dateiname wiederholt wird:sort -o file{,}
tstenner
65

Der sortBefehl druckt das Ergebnis des Sortiervorgangs standardmäßig in die Standardausgabe. Um eine "In-Place" -Sortierung zu erreichen, können Sie Folgendes tun:

sort -o file file

Dies überschreibt die Eingabe filemit der sortierten Ausgabe. Der -oSchalter, mit dem eine Ausgabe angegeben wird, wird von POSIX definiert und sollte daher für alle Versionen von sort: verfügbar sein.

-o Geben Sie den Namen einer Ausgabedatei an, die anstelle der Standardausgabe verwendet werden soll. Diese Datei kann mit einer der Eingabedateien identisch sein.

Wenn Sie das Pech haben, eine Version sortohne den -oSchalter zu haben ( Luis versichert mir, dass sie existiert), können Sie auf standardmäßige Weise eine "In-Place" -Bearbeitung durchführen:

sort file > tmp && mv tmp file
Tom Fenech
quelle
2
+ ^ für die beste Antwort und mit mehrdeutigen Fragen, aber immer noch auf dem obersten Seitenrang, muss also verstärkt werden.
u2n
6
sort file | sponge file

Dies ist im folgenden Fedora-Paket enthalten:

moreutils : Additional unix utilities
Repo        : fedora
Matched from:
Filename    : /usr/bin/sponge
SilverlightFox
quelle
1
Dies funktioniert auch unter Ubuntu nach der Installation mitsudo apt install moreutils
Serge Stroobandt
4

Versuchen Sie Folgendes, um die Datei zu sortieren:

echo "$(sort your_file)" > your_file

Wie in anderen Antworten erläutert, können Sie die Ausgabe nicht direkt zurück in die Eingabedatei umleiten. Sie können den sortBefehl jedoch zuerst auswerten und dann wieder in die Originaldatei umleiten. Auf diese Weise können Sie eine direkte Sortierung implementieren.

In ähnlicher Weise können Sie diesen Trick auch auf andere Befehle anwenden, z. B. pastezeilenweises Anhängen.

Bo Tian
quelle
1
Dies ist schlecht, da es für große Dateien nicht funktioniert, Zeilenumbrüche beendet, echoBackslash- Escape-Effekte in POSIX verursachen kann und -ofür dieselbe Datei wie die Eingabe funktioniert,
Ciro Santilli explained erläutert 8 病 六四 事件 法轮功
4

Hier ist ein Ansatz, den (ab) verwendet vim:

vim -c :sort -c :wq -E -s "${filename}"

Der -c :sort -c :wqTeil ruft nach dem Öffnen der Datei Befehle an vim auf. -Eund -ssind notwendig, damit vim in einem "kopflosen" Modus ausgeführt wird, der nicht zum Terminal zieht.

Dies hat fast keine Vorteile gegenüber dem sort -o "${filename}" "${filename}"Ansatz, außer dass das Dateinamenargument nur einmal verwendet wird.


Dies war nützlich für mich, um eine formatterDirektive in einem nanorcEintrag für .gitignoreDateien zu implementieren . Hier ist, was ich dafür verwendet habe:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s
Anthony Sottile
quelle
4
Sie verwenden vim in Ihrem nanorc? Oh die Ironie.
Brett Holman
2

Möchten Sie alle Dateien in einem Ordner und Unterordner sortieren, die diese überschreiben?

Benutze das:

find . -type f -exec sort {} -o {} \;
luandrea
quelle