Quero imprimir linhas de um arquivo para trás sem usar o tac
comando Existe alguma outra solução para fazer isso com o bash?
shell
text-processing
jimmij
fonte
fonte
Respostas:
Usando
sed
para emulartac
:fonte
sed
. Consulte "36. Ordem inversa de linhas (emule o comando Unix" tac ")". em Famous Sed One-Liners Explained para uma explicação completa de como funciona.sort
- há uma chance de que ele use um arquivo temporário).Com
ed
:Se você estiver em
BSD
/OSX
(e espero que em breveGNU
/linux
também como será o POSIX ):fonte
awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' file.txt
via awk one liners
fonte
awk 'a=$0RS a{}END{printf a}'
but your first
Perl reverter <> `que a melhor resposta / mais rápido na página (para mim), a 10 vezes mais rápido do que esteawk
resposta (todos os anseres awk são sobre o mesmo, o tempo-wise)awk '{a[NR]=$0} END {while (NR) print a[NR--]}'
Como você pediu no bash, eis uma solução que não utiliza awk, sed ou perl, apenas uma função do bash:
A saída de
é
Como esperado.
Mas tenha cuidado que as linhas são armazenadas na memória, uma linha em cada recursivamente chamada instância da função. Tome cuidado com arquivos grandes.
fonte
Você pode canalizá-lo através de:
O
awk
prefixo de cada linha com o número da linha seguido por um espaço. Asort
inverte a ordem das linhas pela triagem no primeiro campo (número de linha) em ordem inversa, estilo numérico. E assed
tiras dos números de linha.O exemplo a seguir mostra isso em ação:
Emite:
fonte
cat -n
age comoawk '{print NR" "$0}'
Em perl:
fonte
perl -e 'print reverse<>'
perl -pe '$\=$_.$\}{'
)reverse<)
é rápido: bom! mas o "muito feio" é extremamente lento como o número de linhas aumenta !! .....-n
era supérfluo lá, obrigado.sort
).Solução somente BASH
leia o arquivo no array bash (uma linha = um elemento do array) e imprima o array na ordem inversa:
fonte
while..read
.IFS=''
eread -r
para impedir que todos os tipos de fugas e remoção posterior do IFS estragem. Eu acho que o bashmapfile ARRAY_NAME
builtin é uma solução melhor para a leitura de matrizes.Bash,
mapfile
mencionado nos comentários para fiximan, e na verdade uma versão possivelmente melhor:Seu desempenho é basicamente comparável à
sed
solução e fica mais rápido à medida que o número de linhas solicitadas diminui.fonte
fonte
como mostrado aqui:
Resultado:
fonte
fonte