Eu tenho um arquivo grande no seguinte formato:
2 1019 0 12
2 1019 3 0
2 1021 0 2
2 1021 2 0
2 1022 4 5
2 1030 0 1
2 1030 5 0
2 1031 4 4
Se os valores na coluna 2 corresponderem, quero somar os valores nas colunas 3 e 4 de ambas as linhas, senão apenas a soma dos valores na linha exclusiva.
Portanto, a saída que eu espero seria assim:
2 1019 15
2 1021 4
2 1022 9
2 1030 6
2 1031 8
Eu posso classificar arquivos de acordo com a coluna 2 com awk
ou sort
e somar as últimas colunas com awk
, mas apenas para linhas individuais, não para duas linhas em que a coluna 2 corresponde.
text-processing
awk
sort
uniq
TomPio
fonte
fonte
$1 $2
como a chave.Respostas:
Eu faria isso em Perl:
Ou awk:
Se você deseja que a saída seja classificada de acordo com a segunda coluna, basta canalizar para
sort
:Observe que ambas as soluções também incluem a 1ª coluna. A idéia é usar a primeira e a segunda colunas como chaves para um hash (em perl) ou uma matriz associativa (em awk). A chave em cada solução é
column1 column2
que, se duas linhas tiverem a mesma coluna dois, mas uma coluna diferente, elas serão agrupadas separadamente:fonte
Talvez isso possa ajudar, mas a coluna 1 é sempre 2 e os resultados dependem disso?
ou como mencionado por glenn jackman nos comentários sobre a classificação:
fonte
PROCINFO["sorted_in"] = "@ind_num_asc"
vez de canalizar parasort
. ref gnu.org/software/gawk/manual/html_node/…Você pode pré-classificar os dados e deixar o awk manipular os detalhes:
Você pode redefinir o acumulador:
Resultado:
Se você realmente deseja manter a primeira coluna, faça algo assim:
Resultado:
Explicação
A
p
variável mantém o$2
valor da linha anterior, ou$1FS$2
no segundo caso acima. Isso significa que o{print p,s}
disparador é disparado quando$2
a linha anterior não é a mesma da linha atual (p!=$2
).fonte
sort -k2
para classificar pela segunda colunaUsando o canivete suíço util
mlr
:Resultado:
Notas:
--nidx
dizmlr
para usar nomes de campos numéricos.put '$5=$3+$4'
cria um novo 5º campo, a soma dos campos 3 e 4 .A
stats1
função (ou " verbo ") é um canivete suíço menordentro do maior canivete suíço de
mlr
, com várias funções baseadas acumulador, tais comosum
,count
,mean
, etc.stats1 -g 1,2
agrupa os dados pelas colunas 1 e 2 e-f 5 -a sum
adiciona o campo 5 desses grupos .stats1
imprime apenas campos nomeados.fonte