A sort
muss alle Eingaben sehen, bevor die Ausgabe beginnen kann. Aus diesem Grund kann das sort
Programm problemlos eine Option zum Ändern einer vorhandenen Datei anbieten:
sort temp.txt -o temp.txt
Im Einzelnen heißt es in der Dokumentation von GNUsort
:
Normalerweise liest sort alle Eingaben, bevor die Ausgabedatei geöffnet wird, sodass Sie eine Datei mithilfe von Befehlen wie sort -o F F
und sicher sortieren können cat F | sort -o F
. Jedoch sort
mit --merge
( -m
) kann die Ausgabedatei öffnen , bevor alle Eingaben zu lesen, so dass ein Befehl wie cat F | sort -m -o F - G
nicht sicher ist , wie Art des Schreiben beginnen könnte , F
bevor cat
getan wird es zu lesen.
Während die Dokumentation von BSD sort
sagt:
Wenn [die] Ausgabedatei eine der Eingabedateien ist, kopiert sort sie in eine temporäre Datei, bevor die Ausgabe sortiert und in die [die] Ausgabedatei geschrieben wird.
Befehle wie uniq
können mit dem Schreiben der Ausgabe beginnen, bevor sie das Lesen der Eingabe beendet haben. Diese Befehle unterstützen normalerweise keine direkte Bearbeitung (und es wäre schwieriger für sie, diese Funktion zu unterstützen).
Normalerweise umgehen Sie dies mit einer temporären Datei. Wenn Sie unbedingt eine Zwischendatei vermeiden möchten, können Sie das gesamte Ergebnis in einem Puffer speichern, bevor Sie es ausschreiben. Zum Beispiel mit perl
:
uniq temp.txt | perl -e 'undef $/; $_ = <>; open(OUT,">temp.txt"); print OUT;'
Hier liest der Perl-Teil die gesamte Ausgabe von uniq
in Variable $_
und überschreibt dann die Originaldatei mit diesen Daten. Sie können dasselbe in der Skriptsprache Ihrer Wahl tun, vielleicht sogar in Bash. Beachten Sie jedoch, dass genügend Speicher zum Speichern der gesamten Datei erforderlich ist. Dies ist bei der Arbeit mit großen Dateien nicht ratsam.