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?
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.
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:
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.
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
file
durch 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).sort infile >outfile
Wenn 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.Antworten:
Sie können die Dateiumleitung verwenden, um die sortierte Ausgabe umzuleiten:
Oder Sie können die verwenden
-o
,--output=FILE
Option sortieren , um anzuzeigen , die gleiche Eingabe- und Ausgabedatei: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.quelle
GNU sort
Infoseite:-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'.sort -o file{,}
Der
sort
Befehl druckt das Ergebnis des Sortiervorgangs standardmäßig in die Standardausgabe. Um eine "In-Place" -Sortierung zu erreichen, können Sie Folgendes tun:Dies überschreibt die Eingabe
file
mit der sortierten Ausgabe. Der-o
Schalter, mit dem eine Ausgabe angegeben wird, wird von POSIX definiert und sollte daher für alle Versionen vonsort
: verfügbar sein.Wenn Sie das Pech haben, eine Version
sort
ohne den-o
Schalter zu haben ( Luis versichert mir, dass sie existiert), können Sie auf standardmäßige Weise eine "In-Place" -Bearbeitung durchführen:quelle
Dies ist im folgenden Fedora-Paket enthalten:
quelle
sudo apt install moreutils
Versuchen Sie Folgendes, um die Datei zu sortieren:
Wie in anderen Antworten erläutert, können Sie die Ausgabe nicht direkt zurück in die Eingabedatei umleiten. Sie können den
sort
Befehl 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.
paste
zeilenweises Anhängen.quelle
echo
Backslash- Escape-Effekte in POSIX verursachen kann und-o
für dieselbe Datei wie die Eingabe funktioniert,Hier ist ein Ansatz, den (ab) verwendet
vim
:Der
-c :sort -c :wq
Teil ruft nach dem Öffnen der Datei Befehle an vim auf.-E
und-s
sind 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
formatter
Direktive in einemnanorc
Eintrag für.gitignore
Dateien zu implementieren . Hier ist, was ich dafür verwendet habe:quelle
nanorc
? Oh die Ironie.Möchten Sie alle Dateien in einem Ordner und Unterordner sortieren, die diese überschreiben?
Benutze das:
quelle