it-swarm.com.de

Unterstützt sort das Sortieren einer Datei an Ort und Stelle, z. B. "sed --in-place"?

Bin ich blind oder gibt es keine Option wie --in-place Für sort?

Um die Ergebnisse in der Eingabedatei zu speichern, verwendet sed -i (--in-place).

Umleiten der Ausgabe von sort in die Eingabedatei

sort < f > f

führt dazu, dass es leer wird. Wenn es keine --in-place Option gibt - gibt es vielleicht einen Trick, wie man das auf handliche Weise macht?

(Das einzige, was mir in den Sinn kommt:

sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$

Das Verschieben ist nicht die richtige Wahl, da Dateiberechtigungen möglicherweise geändert wird. Deshalb überschreibe ich den Inhalt der temporären Datei, die ich dann entferne.)

89

sort hat das -o, --output Option, die einen Dateinamen als Argument verwendet. Wenn es mit der Eingabedatei identisch ist, schreibt es das Ergebnis in eine temporäre Datei und überschreibt dann die ursprüngliche Eingabedatei (genau das gleiche wie das, was sed -i tut).

Von GNU sort Infoseite:

`-o OUTPUT-FILE'
`--output=OUTPUT-FILE'
      Write output to OUTPUT-FILE instead of standard output.  Normally,
      `sort' reads all input before opening OUTPUT-FILE, so you can
      safely sort a file in place by using commands like `sort -o F F'
      and `cat F | sort -o F'.  However, `sort' with `--merge' (`-m')
      can open the output file before reading all input, so a command
      like `cat F | sort -m -o F - G' is not safe as `sort' might start
      writing `F' before `cat' is done reading it.

      On newer systems, `-o' cannot appear after an input file if
      `POSIXLY_CORRECT' is set, e.g., `sort F -o F'.  Portable scripts
      should specify `-o OUTPUT-FILE' before any input files.

und von The Open Group Base Specifications, Ausgabe 7 :

-o  output
    Specify the name of an output file to be used instead of the standard 
    output. This file can be the same as one of the input files.
123
enzotib

Sie können die Funktion sponge verwenden, die zuerst das stdin tränkt und es dann in eine Datei schreibt, wie:

sort < f | sponge f

Der Nachteil von sponge ist, dass die Ausgabe temporär im Speicher gespeichert wird, was bei großen Dateien problematisch sein kann. Andernfalls müssen Sie es zuerst in eine Datei schreiben und dann die Originaldatei überschreiben.

Wie jedoch aus anderen Antworten hervorgeht, sind Änderungen an Ort und Stelle im Allgemeinen keine gute Idee, da die Maschine während eines Prozesses (z. B. sponge one) möglicherweise abstürzt und Sie dann beide verlieren können die ursprüngliche und neue Datei. Sie sollten es zuerst in eine andere Datei schreiben und dann eine atomare Anweisung mv (verschieben) verwenden.

11

Es ist gefährlich, die Eingabedatei mit der Ausgabedatei zu überschreiben, denn wenn das Programm oder das System beim Schreiben der Datei abstürzt, haben Sie beide verloren.

Einige Programme (meistens GNU Versionen)) verfügen über eine direkte Option (z. B. -i auf Perl und GNU sed; -o on GNU sort). Sie arbeiten, indem sie die Daten in eine temporäre Datei einfügen und dann an ihren Platz verschieben. Für Programme, die keine solche Option haben, Colin Watsons Dienstprogramm sponge (enthalten in Joey Hess 'moreutils ) erledigt den Job sicher für jedes Programm (Beispiele: Kann ich cut veranlassen, dass eine Datei an Ort und Stelle geändert wird? ; Wie kann ich dafür sorgen, dass iconv die Eingabedatei durch die konvertierte Ausgabe ersetzt? ).

Nur in den seltenen Fällen, in denen Sie die Originaldatei nicht mit denselben Berechtigungen neu erstellen können, empfehle ich, die vorhandene Datei zu überschreiben. In diesem Fall sollten Sie die ursprüngliche Eingabe besser irgendwo speichern. Und dann können Sie einfach die Kopie der Eingabe verarbeiten und in die Originaldatei senden.

cp -p f ~/f.backup
sort <~/f.backup >|f
rm ~/f.backup # optional

Verwenden -o oder probieren Sie den vim-way:

$ ex -s +'%!sort' -cxa file.txt
4
kenorb