shell - column - sort ubuntu example
Cómo invertir las líneas de un archivo de texto? (8)
En GNU coreutils , hay tac (1)
Estoy escribiendo un pequeño script de shell que necesita invertir 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 estoy obteniendo una lista de identificadores de compromiso 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
así:
... | cat -b | sort -rn | cut -f2-
Esto usa cat
para numerar cada línea, luego sort
para ordenarlas en orden numérico descendente (que termina revirtiendo todo el archivo), luego cut
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?
: "@(#)$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]*://''
Funciona como un encanto para mí...
cat -b solo números líneas no en blanco "
Si ese es el único problema que desea evitar, ¿por qué no usar "cat -n" para numerar todas las líneas?
Similar al ejemplo sed anterior, usando perl : tal vez más memorable (dependiendo de cómo esté conectado su cerebro):
perl -e ''print reverse <>''
La respuesta no es 42 sino tac
.
Editar: más lento pero consume más memoria usando sed
sed ''x;1!H;$!d;x''
y aún más
perl -e''print reverse<>''
Hay un comando estándar para su propósito:
tail -r file.txt
imprime las líneas de archivo.txt en orden inverso
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