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?

Foi útil?

Solução

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top