Wie Zeilen einer Textdatei umzukehren?
-
03-07-2019 - |
Frage
Ich schreibe einen kleinen Shell-Skript, das die Zeilen einer Textdatei umkehren muss. Gibt es einen Standard-Filter Befehl diese Art der Sache zu tun?
Meine spezifische Anwendung ist, dass ich eine Liste von Git bin immer Identifikatoren begehen, und ich möchte, dass sie in umgekehrter Reihenfolge verarbeiten:
git log --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1 | reverse
Das Beste, was ich habe kommen mit ist reverse
wie folgt umzusetzen:
... | cat -b | sort -rn | cut -f2-
Dies verwendet cat
jede Zeile nummerieren, dann sort
sie numerisch in absteigender Reihenfolge zu sortieren (die die gesamte Datei Umkehr endet), dann cut
die nicht benötigte Zeilennummer zu entfernen.
Die oben genannten Arbeiten für meine Anwendung, kann aber im allgemeinen Fall, weil cat -b
nur Zahlen nicht leere Zeilen nicht.
Gibt es eine bessere, allgemeinere Art und Weise, dies zu tun?
Lösung
GNU coreutils , gibt es tac (1)
Andere Tipps
Die Antwort ist nicht 42, sondern tac
.
Edit: Langsamer, aber ein höherer Speicherbedarf sed
mit
sed 'x;1!H;$!d;x'
und noch länger
perl -e'print reverse<>'
Es gibt ein Standard Befehl für Ihren Zweck:
tail -r file.txt
druckt die Linien von datei.txt in umgekehrter Reihenfolge!
cat -b nur Zahlen nicht leere Zeilen "
Wenn das das einzige Problem ist Sie vermeiden wollen, warum dann verwenden „cat -n“ nicht alle Linien nummerieren?
: "@(#)$Id: reverse.sh,v 1.2 1997/06/02 21:45:00 johnl Exp $"
#
# Reverse the order of the lines in each file
awk ' { printf("%d:%s\n", NR, $0);}' $* |
sort -t: +0nr -1 |
sed 's/^[0-9][0-9]*://'
Funktioniert wie ein Zauber für mich ...
ähnlich wie bei dem sed Beispiel oben mit perl - vielleicht einprägsamer (je nachdem, wie Ihr Gehirn verdrahtet ist):
perl -e 'print reverse <>'
In diesem Fall verwenden Sie nur --reverse
:
$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1
rev <name of your text file.txt>
Sie können dies auch tun:
echo <whatever you want to type>|rev
awk '{a[i++]=$0}END{for(;i-->0;)print a[i]}'
Mehr schneller als sed
und kompatibel für embed Geräte wie openwrt.