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?

È stato utile?

Soluzione

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top