Gibt es eine Möglichkeit, die Pipe-Ausgabe in derselben Datei zu speichern, in der sie verarbeitet wurde? Zum Beispiel ist es das, was ich gerade mache
$ cat filename | sort | uniq > result
$ rm -f filename
$ mv result filename
Ich habe mich gefragt, ob es eine Möglichkeit gibt, dies in nur einer Zeile zu tun (ohne diese Befehle mit && anzuhängen).
Dies ist nicht der Weg, sondern eine Idee zu bekommen
$ cat filename | sort | uniq > filename
command-line
bash
whitenoisedb
quelle
quelle
echo $(cat filename | sort | uniq > result) > filename
oder so ? Ich komme gerade vorbei und habe keine Zeit, es zu versuchen.Antworten:
Sie können
sponge
aus dem moreutils- Paket Folgendes verwenden :Sie brauchen auch keine Pipe nach
uniq
, da bei der Sortierungsort
die-u
Option für eindeutige Zeilen besteht.Beachten Sie, dass auf einem GNU-System mit UTF-8-Gebietsschemata
sort -u
odersort | uniq
nicht eindeutige Zeilen angegeben wurden, sondern die erste aus einer Folge von Zeilen, die in der aktuellen Ländereinstellung gleich sortiert sind.gab dir nur
①
. Wenn Sie das Gebietsschema in C ändern, wird die Sortierreihenfolge basierend auf den Bytewerten erzwungen:quelle
Sie brauchen keinen zusätzlichen Befehl wie
cat
unduniq
und auch nichtrm
Befehl undmv
Befehl, um den Dateinamen zu entfernen und umzubenennen. benutze einfach den einfachen Befehl.Wie es funktioniert?
sort
Der Befehl sortiert Ihren Dateinamen und entfernt mit der-u
Option doppelte Zeilen daraus. Dann-o
schreibt mit der Option die Ausgabe in dieselbe Datei mit der In-Place-Methode.quelle
sort
Ausführung abstürzt , verlieren Sie Ihre Originaldatei.Ihr vorgeschlagenes Beispiel (unten) funktioniert nicht, da Sie gleichzeitig aus derselben Datei lesen und in dieselbe Datei schreiben würden.
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). .
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.
quelle
cat filename | sort
um nursort filename
-cat
hier nicht erforderlich ist.cat
könnte in diesem Fall unnötig sein, aber ich habe mich auf den Umleitungsteil konzentriert.Sie können den
tee
Befehl verwenden:Der
tee
Befehl liest von der Standardeingabe und schreibt in die Standardausgabe und -dateien.quelle
(cat ~/file | grep -v 3662 ; printentry 3662) | tee ~/file > /dev/null
funktioniert. Wie der ursprüngliche Beitrag funktioniert dies nicht, wenn Sie nur> ~/file
ohne dietee
. Tee scheint hier ähnlich zu seinsort -o file
, der in die genannte Datei schreibt, ohne dieselbe Pipe fortzusetzen.(cat x | grep -v 7 ; echo 7) | tee x > /dev/null; cat x
Ich empfehle eine temporäre Datei undmv
oder vielleicht die Lösung aus dem Link von @ Steven.Sie können Vim im Ex-Modus verwenden:
sort u
sortiere einzigartigx
Schreiben Sie, wenn Änderungen vorgenommen wurden und beenden Sie das Programmquelle