Como linhas de um arquivo de texto reverter?
-
03-07-2019 - |
Pergunta
Eu estou escrevendo um pequeno shell script que precisa reverter as linhas de um arquivo de texto. Existe um comando padrão filtro para fazer esse tipo de coisa?
Meu aplicação específica é que eu estou recebendo uma lista de git commit identificadores, e eu quero processá-los em ordem inversa:
git log --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1 | reverse
O melhor que eu vim acima com é implementar reverse
assim:
... | cat -b | sort -rn | cut -f2-
Isto usa cat
ao número cada linha, então sort
para classificá-los em ordem decrescente numérica (que acaba revertendo todo o arquivo), então cut
para remover o número da linha desnecessários.
As obras acima para a minha candidatura, mas pode falhar no caso geral, porque cat -b
apenas números não vazias linhas.
Existe uma maneira melhor, mais geral para fazer isso?
Solução
Na GNU coreutils , há tac (1)
Outras dicas
Resposta não é 42 mas tac
.
Editar: Mais lento, mas mais memória consome usando sed
sed 'x;1!H;$!d;x'
e ainda mais tempo
perl -e'print reverse<>'
Há um padrão comando para o seu propósito:
tail -r file.txt
imprime as linhas de file.txt na ordem inversa!
gato -b apenas números não vazias linhas "
Se esse é o único problema que você quer evitar, então porque não usar "-n gato" para o número de todas as linhas?
: "@(#)$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 um encanto para mim ...
Similar ao sed exemplo acima, usando perl - talvez mais memorável (dependendo de como o cérebro está ligado):
perl -e 'print reverse <>'
Neste caso, basta usar --reverse
:
$ git log --reverse --pretty=oneline work...master | grep -v DEBUG: | cut -d' ' -f1
rev <name of your text file.txt>
Você pode até fazer isso:
echo <whatever you want to type>|rev
awk '{a[i++]=$0}END{for(;i-->0;)print a[i]}'
dispositivos mais rápido do que sed
e compatível para incorporar como openwrt.