Em relação à escolha de ferramentas: normalmente, quanto mais especializada for uma ferramenta, mais rápido ela é. Portanto, os tubos que envolvem tr
, cut
, grep
, sort
, etc. tendem a ser mais rápidos que sed
, que tende a ser mais rápido que awk
, que tende a ser mais rápido que perl
, python
, ruby
. Mas isso, claro, depende muito da tarefa também. Se você ler que Perl é mais rápido, então você interpretou mal ou a comparação foi contra um loop de shell que processa uma linha de cada vez (que definitivamente será lenta para arquivos com milhões de linhas).
Se a sua entrada estiver em um formato onde as linhas a serem mescladas sejam consecutivas, o awk é uma boa aposta (não existe uma maneira sã de executar adições no sed).
awk -v OFS='\t' ' # use tabs to separate output fields
NR==1 {print; next} # keep the first line intact
function flush () { # function to print a completed sum
if (key != "") print previous, sum, more;
sum=0
}
{key = $1 OFS $2 OFS $3 OFS $4} # break out the comparison key
key!=previous {flush()} # if the comparison key has changed, print the accumulated sum
{previous=key; sum+=$5; more=$6} # save the current line
END {flush()} # print the last
'
Se as linhas não forem consecutivas, você pode classificá-las dessa forma. Implementações típicas de sort
são altamente otimizadas e mais rápidas do que manipular estruturas de dados em linguagens de alto nível.
sort | awk …
Isso pressupõe que os delimitadores de coluna sejam consistentes, por exemplo, sempre uma aba. Se não estiverem, pré-processe a entrada para torná-la assim ou use sort -k1,1 -k2,2 -k3,3 -k4,4
para comparar esses campos específicos sem considerar os delimitadores.