Maneira eficiente de imprimir linhas de um arquivo enorme usando awk, sed ou algo mais?

Maneira eficiente de imprimir linhas de um arquivo enorme usando awk, sed ou algo mais?

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

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

Ou talvez exista uma alternativa ainda melhor para sed ou awk?

Responder1

Nenhum dos dois, use tailou headem vez disso:

$ 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. Executei os dois comandos 100 vezes e calculei a média:

cauda:

real    0.03962
user    0.02956
sys     0.01456

cabeça:

real    0.06284
user    0.07356
sys     0.07244

Imagino tailque seja mais rápido porque embora tenha que buscar até a linha 4e10, na verdade ele não imprime nada até chegar lá, enquanto headimprime tudo até a linha 4e10 + 10.


Compare com alguns outros métodos classificados em 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

estranho:

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

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

informação relacionada