Ihr vorgeschlagenes Beispiel (unten) funktioniert nicht, da Sie gleichzeitig aus derselben Datei lesen und in dieselbe Datei schreiben würden.
$ cat filename | sort | uniq > filename
Die Idee mit einer Pipe oder Umleitung ist, dass der Befehl auf der linken und rechten Seite jeder Pipe oder Umleitung gleichzeitig parallel ausgeführt wird. Der Befehl auf der rechten Seite verarbeitet Informationen so, wie sie ihm vom Befehl auf der linken Seite übergeben werden, während der Befehl auf der linken Seite noch ausgeführt wird.
Damit Ihr Szenario funktioniert, muss der Befehl, der aus der Datei liest, beendet werden, bevor der Befehl, der in die Datei schreibt, beginnt. Damit dies funktioniert, müssen Sie die Ausgabe zunächst an einen temporären Speicherort umleiten. Anschließend müssen Sie sie vom temporären Speicherort zurück in die Datei senden.
Ein besserer Weg, dies zu tun, ist im Grunde wie in Ihrem vorherigen Beispiel, in dem Sie zu einer temporären Datei umleiten und diese Datei dann wieder in das Original umbenennen (außer, dass Sie die Datei nicht zuerst löschen müssen, da das Verschieben alle vorhandenen Ziele löscht). .
$ cat filename | sort | uniq > result
$ mv -f result filename
Sie können es auch in einer Zeichenfolgenvariablen speichern. Dies funktioniert jedoch nur, wenn die Daten so klein sind, dass sie alle gleichzeitig in den Arbeitsspeicher passen.
echo $(cat filename | sort | uniq > result) > filename
oder so ? Ich komme gerade vorbei und habe keine Zeit, es zu versuchen.