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.

2voto

driver Punkte 21

Ich sehe viele interessante Ideen. Aber versuchen Sie meine Idee. Fügen Sie Ihren Text hier ein:

rev | tr ' \n ' '~' | rev | tr '~' ' \n '

die davon ausgeht, dass das Zeichen '~' nicht in der Datei enthalten ist. Dies sollte auf jeder UNIX-Shell funktionieren, die bis ins Jahr 1961 zurückreicht. Oder so ähnlich.

1voto

Marius Hofert Punkte 6186

Für Emacs-Benutzer: C-x h (die gesamte Datei auswählen) und dann M-x reverse-region . Es funktioniert auch, wenn Sie nur Teile oder Zeilen auswählen und diese umkehren.

1voto

youkaichao Punkte 1508

Es kommt vor, dass ich das letzte Wort haben will. n Zeilen einer sehr großen Textdatei effizient .

Das erste, was ich versucht habe, ist tail -n 10000000 file.txt > ans.txt aber ich fand es sehr langsam, denn tail muss den Ort suchen und dann zurückgehen, um die Ergebnisse zu drucken.

Wenn ich das merke, wechsle ich zu einer anderen Lösung: tac file.txt | head -n 10000000 > ans.txt . Diesmal muss die Suchposition nur vom Ende an die gewünschte Stelle verschoben werden und 50 % Zeitersparnis !

Die Botschaft zum Mitnehmen:

Utilisez tac file.txt | head -n n wenn Ihr tail hat nicht die -r Option.

1voto

Georg Fischer Punkte 11

Sie können Perl auf der Kommandozeile verwenden:

perl -e 'my @b=(); while(<>) {push(@b, $_);}; print join("", reverse(@b));' orig > rev

0voto

ITNM Punkte 25

Beste Lösung:

tail -n20 file.txt | tac

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