Pregunta

Estoy escribiendo un script de shell pequeño que necesita revertir las líneas de un archivo de texto. ¿Hay un comando de filtro estándar para hacer este tipo de cosas?

Mi aplicación específica es que obtengo una lista de identificadores de confirmación de Git, y quiero procesarlos en orden inverso:

git log --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1 | reverse

Lo mejor que he encontrado es implementar reverse de esta manera:

... | cat -b | sort -rn | cut -f2-

Esto utiliza cat para numerar cada línea, luego sort para ordenarlos en orden numérico descendente (que termina invirtiendo todo el archivo), luego corta para eliminar el número de línea innecesario.

Lo anterior funciona para mi aplicación, pero puede fallar en el caso general porque cat -b solo numera líneas no en blanco.

¿Hay una forma mejor y más general de hacer esto?

¿Fue útil?

Solución

Otros consejos

La respuesta no es 42 sino tac .

Editar: Más lento pero consume más memoria usando sed

sed 'x;1!H;$!d;x'

e incluso más largo

perl -e'print reverse<>'

Hay un comando estándar para su propósito:

tail -r file.txt

imprime las líneas de file.txt en orden inverso!

cat -b solo numera líneas no en blanco "


Si ese es el único problema que desea evitar, entonces ¿por qué no usar " cat -n " numerar todas las líneas?

:   "@(#)$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]*://'

Funciona como un encanto para mí ...

Similar al ejemplo sed anterior, usar perl , tal vez más memorable (dependiendo de cómo esté conectado tu cerebro):

perl -e 'print reverse <>'

En este caso, solo usa --reverse :

$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1
rev <name of your text file.txt>

Incluso puedes hacer esto:

echo <whatever you want to type>|rev
awk '{a[i++]=<*>}END{for(;i-->0;)print a[i]}'

Más rápido que sed y compatible para dispositivos incrustados como openwrt.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top