Come invertire le righe di un file di testo?
-
03-07-2019 - |
Domanda
Sto scrivendo un piccolo script shell che deve invertire le righe di un file di testo. Esiste un comando filtro standard per fare questo genere di cose?
La mia specifica applicazione è che sto ottenendo un elenco di identificativi di commit Git e voglio elaborarli in ordine inverso:
git log --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1 | reverse
Il migliore che ho ideato è implementare reverse
in questo modo:
... | cat -b | sort -rn | cut -f2-
Usa cat
per numerare ogni riga, quindi ordina
per ordinarle in ordine numerico decrescente (che finisce per invertire l'intero file), quindi taglia
per rimuovere il numero di riga non necessario.
Quanto sopra funziona per la mia applicazione, ma potrebbe non riuscire nel caso generale perché cat -b
numera solo le linee non vuote.
Esiste un modo migliore e più generale per farlo?
Soluzione
In GNU coreutils , c'è tac (1)
Altri suggerimenti
La risposta non è 42 ma tac
.
Modifica: più lento ma richiede più memoria utilizzando sed
sed 'x;1!H;$!d;x'
e anche più a lungo
perl -e'print reverse<>'
Esiste un comando standard per il tuo scopo:
tail -r file.txt
stampa le righe di file.txt in ordine inverso!
cat -b numera solo le linee non vuote "
Se questo è l'unico problema che vuoi evitare, allora perché non usare " cat -n " numerare tutte le righe?
: "@(#)$Id: reverse.sh,v 1.2 1997/06/02 21:45:00 johnl Exp <*>quot;
#
# Reverse the order of the lines in each file
awk ' { printf("%d:%s\n", NR, <*>);}' $* |
sort -t: +0nr -1 |
sed 's/^[0-9][0-9]*://'
Funziona come un incanto per me ...
Simile all'esempio sed sopra, usando perl - forse più memorabile (a seconda di come è collegato il tuo cervello):
perl -e 'print reverse <>'
In questo caso, basta usare --reverse
:
$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1
rev <name of your text file.txt>
Puoi persino farlo:
echo <whatever you want to type>|rev
awk '{a[i++]=<*>}END{for(;i-->0;)print a[i]}'
Più veloce di sed
e compatibile per dispositivi embed come openwrt.