Maneira eficiente de imprimir linhas de um arquivo massivo usando o awk, sed ou outra coisa? [duplicado]

5

Se eu tivesse um arquivo de texto simples contendo 8 milhões de linhas e eu quisesse imprimir linhas de 4.000.010 a 4.000.000 na tela, o que seria mais eficiente: awk ou sed?

Não há padrão para o texto e, infelizmente, um banco de dados não é uma opção. Eu sei que isso não é ideal, só estou curioso para saber qual deles concluiria a tarefa mais rapidamente.

Ou talvez haja uma alternativa melhor para sed ou awk?

    
por dukevin 09.10.2013 / 22:15

1 resposta

10

Nenhum dos dois, use tail ou head :

$ time tail -n 4000001 foo | head -n 11
real    0m0.039s
user    0m0.032s
sys     0m0.004s

$ time head -n 4000010 foo | tail -n 11
real    0m0.055s
user    0m0.064s
sys     0m0.036s

tail é de fato consistentemente mais rápido. Eu corri os dois comandos 100 vezes e calculei a média deles:

final:

real    0.03962
user    0.02956
sys     0.01456

cabeça:

real    0.06284
user    0.07356
sys     0.07244

Eu imagino que tail é mais rápido porque apesar de ter que procurar todo o caminho até a linha 4e10, ele não imprime nada até chegar lá enquanto head imprime tudo até a linha 4e10 + 10.

Compare com alguns outros métodos classificados por ordem de tempo:

sed:

$ time sed -n 4000000,4000011p;q foo
real    0m0.312s
user    0m0.236s
sys     0m0.072s

Perl:

$ time perl -ne 'next if $.<4000000; print; exit if $.>=4000010' foo 
real    0m1.000s
user    0m0.936s
sys     0m0.064s

awk:

$ time awk '(NR>=4000000 && NR<=4000010){print} (NR==4000010){exit}' foo 
real    0m0.955s
user    0m0.868s
sys     0m0.080s

Basicamente, a regra é quanto menos você analisar, mais rápido você é. Tratar a entrada como um fluxo de dados que só precisa ser impresso na tela (como tail ) será sempre o caminho mais rápido.

    
por 09.10.2013 / 22:23