¿Cómo revertir las líneas de un archivo de texto?
-
03-07-2019 - |
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?
Solución
En coreutils de GNU , hay tac (1)
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.