Quiero imprimir líneas desde un archivo hacia atrás sin usar el tac
comando. ¿Hay alguna otra solución para hacer tal cosa con bash?
shell
text-processing
jimmij
fuente
fuente
Respuestas:
Usando
sed
para emulartac
:fuente
sed
one-liner. Consulte "36. Orden inverso de líneas (emular" tac "comando Unix)". en el famoso Sed One-Liners explicado para una explicación completa de cómo funciona.sort
, existe la posibilidad de que use un archivo temporal).Con
ed
:Si está en
BSD
/OSX
(y con suerte pronto enGNU
/linux
también, ya que será POSIX ):fuente
awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' file.txt
a través de awk one liners
fuente
awk 'a=$0RS a{}END{printf a}'
but your first
perl reverse <> `es la respuesta mejor / más rápida en la página (para mí), 10 veces más rápido que estaawk
respuesta (todos los awk anseres son casi iguales, en cuanto al tiempo)awk '{a[NR]=$0} END {while (NR) print a[NR--]}'
Como pediste hacerlo en bash, aquí hay una solución que no utiliza awk, sed o perl, solo una función bash:
La salida de
es
Como se esperaba.
Pero tenga en cuenta que las líneas se almacenan en la memoria, una línea en cada instancia recursivamente llamada instancia de la función. Tan cuidadoso con los archivos grandes.
fuente
Puedes canalizarlo a través de:
Los
awk
prefijos de cada línea con el número de línea seguido de un espacio. Elsort
invierte el orden de las líneas de clasificación en el primer campo (número de línea) en orden inverso, estilo numérico. Y lassed
tiras de los números de línea.El siguiente ejemplo muestra esto en acción:
Produce:
fuente
cat -n
actúa comoawk '{print NR" "$0}'
En perl:
fuente
perl -e 'print reverse<>'
perl -pe '$\=$_.$\}{'
)reverse<)
es rápido: ¡bien! pero el "realmente feo" es extremadamente lento a medida que aumenta el número de líneas. !! ....-n
fue superfluo allí, gracias.sort
).Solución solo BASH
lea el archivo en la matriz bash (una línea = un elemento de la matriz) e imprima la matriz en orden inverso:
fuente
while..read
.IFS=''
yread -r
para evitar que todo tipo de fugas y la eliminación de IFS final lo arruinen. Sinmapfile ARRAY_NAME
embargo, creo que bash builtin es una mejor solución para leer en matrices.Bash, con los
mapfile
comentarios mencionados en Fiximan, y en realidad una versión posiblemente mejor:Su rendimiento es básicamente comparable a la
sed
solución, y se acelera a medida que disminuye el número de líneas solicitadas.fuente
fuente
como se muestra aquí:
Resultado:
fuente
fuente