842 Stimmen

Wie kann ich die Reihenfolge der Zeilen in einer Datei umkehren?

Ich möchte die Reihenfolge der Zeilen in einer Textdatei (oder stdin) umkehren, wobei der Inhalt jeder Zeile erhalten bleibt.

Also, d.h., beginnend mit:

foo
bar
baz

Ich würde gerne mit

baz
bar
foo

Gibt es ein standardmäßiges UNIX-Befehlszeilenprogramm für diese Aufgabe?

8 Stimmen

Wichtiger Hinweis zum Vertauschen der Linien: Vergewissern Sie sich, dass Ihre Datei einen abschließenden Zeilenumbruch enthält. Erstens. Andernfalls werden die letzten beiden Zeilen einer Eingabedatei in einer Ausgabedatei zu einer Zeile zusammengefügt (zumindest bei Verwendung der Option perl -e 'print reverse <>' aber das gilt wahrscheinlich auch für andere Methoden).

1 Stimmen

0 Stimmen

Außerdem ist es fast ein Duplikat (wenn auch älter) von unix.stackexchange.com/questions/9356/ . Wie in diesem Fall ist eine Migration zu unix.stackexchange.com wahrscheinlich angebracht.

12voto

Tim Menzies Punkte 631

Ich mag die " tail -r ", aber meine Lieblingsantwort von Gawk lautet: ....

gawk '{ L[n++] = $0 } 
  END { while(n--) 
        print L[n] }' file

11voto

Yekatandilburg Punkte 181

Die einfachste Methode ist die Verwendung der tac Befehl. tac es cat Inverse. Beispiel:

$ cat order.txt
roger shah 
armin van buuren
fpga vhdl arduino c++ java gridgain
$ tac order.txt > inverted_file.txt
$ cat inverted_file.txt
fpga vhdl arduino c++ java gridgain
armin van buuren
roger shah

9voto

Mark Booth Punkte 7224

Wenn Sie die Datei an Ort und Stelle ändern möchten, können Sie Folgendes ausführen

sed -i '1!G;h;$!d' filename

Dadurch entfällt die Notwendigkeit, eine temporäre Datei zu erstellen und dann die Originaldatei zu löschen oder umzubenennen, und es wird das gleiche Ergebnis erzielt. Zum Beispiel:

$tac file > file2
$sed -i '1!G;h;$!d' file
$diff file file2
$

Auf der Grundlage der Antwort von ephemient die fast, aber nicht ganz das bewirkt, was ich wollte.

4voto

Yauhen Yakimovich Punkte 12897

EDITAR Im Folgenden wird eine zufällig sortierte Liste mit Zahlen von 1 bis 10 erstellt:

seq 1 10 | sort -R | tee /tmp/lst |cat <(cat /tmp/lst) <(echo '-------') **...**

wobei die Punkte durch den eigentlichen Befehl ersetzt werden, der die Liste umkehrt

tac

seq 1 10 | sort -R | tee /tmp/lst |cat <(cat /tmp/lst) <(echo '-------') \
<(tac)

python: Verwendung von [::-1] auf sys.stdin

seq 1 10 | sort -R | tee /tmp/lst |cat <(cat /tmp/lst) <(echo '-------') \
<(python -c "import sys; print(''.join(([line for line in sys.stdin])[::-1]))")

3voto

R. Kumar Punkte 113

Dies wird sowohl unter BSD als auch unter GNU funktionieren.

awk '{arr[i++]=$0} END {while (i>0) print arr[--i] }' filename

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X