Eu faria isso em Perl:
$ perl -lane '$k{"$F[0] $F[1]"}+=$F[2]+$F[3];
END{print "$_ $k{$_}" for keys(%k) }' file
2 1019 15
2 1021 4
2 1030 6
2 1031 8
2 1022 9
Ou awk:
awk '{a[$1" "$2]+=$3+$4}END{for (i in a){print i,a[i]}}' file
Se você deseja que a saída seja classificada de acordo com a segunda coluna, você pode canalizar para sort
:
awk '{a[$1" "$2]+=$3+$4}END{for (i in a){print i,a[i]}}' file | sort -k2
Observe que as duas soluções também incluem a primeira coluna. A idéia é usar a primeira e a segunda colunas como chaves para um hash (em perl) ou um array associativo (em awk). A chave em cada solução é column1 column2
, portanto, se duas linhas tiverem a mesma coluna dois, mas uma coluna diferente, elas serão agrupadas separadamente:
$ cat file
2 1019 2 3
2 1019 4 1
3 1019 2 2
$ awk '{a[$1" "$2]+=$3+$4}END{for (i in a){print i,a[i]}}' file
3 1019 4
2 1019 10