Quiero imprimir líneas desde un archivo hacia atrás sin usar el taccomando. ¿Hay alguna otra solución para hacer tal cosa con bash?
shell
text-processing
jimmij
fuente
fuente

Respuestas:
Usando
sedpara emulartac:fuente
sedone-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/linuxtambién, ya que será POSIX ):fuente
awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' file.txta través de awk one liners
fuente
awk 'a=$0RS a{}END{printf a}'but your firstperl reverse <> `es la respuesta mejor / más rápida en la página (para mí), 10 veces más rápido que estaawkrespuesta (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
awkprefijos de cada línea con el número de línea seguido de un espacio. Elsortinvierte 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 lassedtiras de los números de línea.El siguiente ejemplo muestra esto en acción:
Produce:
fuente
cat -nactú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. !! ....-nfue 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 -rpara evitar que todo tipo de fugas y la eliminación de IFS final lo arruinen. Sinmapfile ARRAY_NAMEembargo, creo que bash builtin es una mejor solución para leer en matrices.Bash, con los
mapfilecomentarios mencionados en Fiximan, y en realidad una versión posiblemente mejor:Su rendimiento es básicamente comparable a la
sedsolución, y se acelera a medida que disminuye el número de líneas solicitadas.fuente
fuente
como se muestra aquí:
Resultado:
fuente
fuente