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 tail
ou head
em 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 tail
que seja mais rápido porque embora tenha que buscar até a linha 4e10, na verdade ele não imprime nada até chegar lá, enquanto head
imprime 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 tail
acontece) sempre será o caminho mais rápido.