Linhas 1,2,3,4,…, n-1, n para linhas n, n-1,…, 4,3,2,1

2

Acabei de perceber que eu poderia resolver este problema invertendo os números de linha de 1, 2, 3, ..., n para n, n-1, ..., 3,2,1 e, em seguida, use a mesma lógica que anteriormente . Então, eu quero saber como posso reverter a ordem das linhas?

    
por Community 18.09.2011 / 17:59

4 respostas

4

Para o seu problema específico, essa não é a maneira mais eficiente de fazer isso, no entanto, você pode usar qualquer um dos itens a seguir para imprimir um arquivo com linhas em ordem reversa, com vários graus de portabilidade ( tac , por exemplo não está incluído por padrão em muitos Unixes):

  • sed '1!G;h;$!d' [file]
  • awk '{f[n=NR]=$0}END{for(i=n;i>0;i--)print f[i]}' [file]
  • perl -e 'print reverse<>' [file]
  • tac [file]

No meu sistema, o mais rápido é tac , conforme testado pelo seguinte:

$ printf '%s\n' {a..z}{a..z}{a..z} > foo
$ time sed '1!G;h;$!d' foo > /dev/null 2>&1

real    0m0.582s
user    0m0.544s
sys     0m0.012s

$ time awk '{f[n=NR]=$0}END{for(i=n;i>0;i--)print f[i]}' foo > /dev/null 2>&1

real    0m0.060s
user    0m0.052s
sys     0m0.008s

$ time perl -e 'print reverse<>' foo > /dev/null 2>&1

real    0m0.021s
user    0m0.016s
sys     0m0.004s

$ time tac foo > /dev/null 2>&1

real    0m0.003s
user    0m0.004s
sys     0m0.000s

... então, se você tiver tac , use-o, mas, caso contrário, use perl ou awk .

    
por 18.09.2011 / 18:54
5

tac ( cat para trás e incluído em coreutils também) irá cat um arquivo na ordem inversa:

$ cat /tmp/test
One
Two
Three

$ tac /tmp/test
Three
Two
One

(No caso do problema específico que você mencionou, as soluções são melhores do que reverter o arquivo inteiro apenas para que você possa anexar um arquivo e reverter todo o arquivo novamente)

    
por 18.09.2011 / 18:12
2

O utilitário tac inverte as linhas. É cat ao contrário.

    
por 18.09.2011 / 18:12
1

Os utilitários GNU (Linux, Cygwin) e BusyBox têm o comando tac , que inverte a ordem das linhas em um arquivo de texto.

Em sistemas que não possuem tac , você pode trabalhar com comandos padrão. A resposta de Chris Down mostra algumas maneiras de fazer isso armazenando o arquivo inteiramente na memória. Para um arquivo muito grande, uma maneira de trabalhar sem sobrecarregar a maioria dos unices é fazer sort fazer a reversão. Isso não é tão eficiente para arquivos de tamanho médio, mas as implementações de classificação normalmente podem lidar com arquivos maiores que a memória disponível.

nl | sort -nr | sed 's/.*\t//'

(Substitua \t por um caractere de tabulação literal).

Como já observado por Michael Mrozek , as linhas de reversão são uma maneira inadequada de preceder dados em um arquivo. O método é difícil de entender e realiza muito trabalho extra.

    
por 18.09.2011 / 19:53