Text-Processing

基於匹配欄位對列求和

  • April 6, 2019

我有一個以下格式的大文件:

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

如果第2 列中的值匹配,我想將兩行的第3 列第 4列中的值相加,否則只是唯一行中值的總和。

所以我希望的輸出看起來像這樣:

2 1019 15 
2 1021 4 
2 1022 9 
2 1030 6 
2 1031 8

我可以使用or根據第 2 列對文件進行排序,並使用 對最後一列求和,但僅適用於單獨的行,而不適用於第 2匹配的兩行。awk``sort``awk

我會在 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

或 awk:

awk '{a[$1" "$2]+=$3+$4}END{for (i in a){print i,a[i]}}' file 

如果您希望根據第二列對輸出進行排序,您可以通過管道傳輸到sort

awk '{a[$1" "$2]+=$3+$4}END{for (i in a){print i,a[i]}}' file | sort -k2

請注意,這兩種解決方案也包括第一列。這個想法是使用第一列和第二列作為散列(在 perl 中)或關聯數組(在 awk 中)的鍵。每個解決方案的關鍵是column1 column2,如果兩行具有相同的第二列但不同的第一列,它們將分別分組:

$ 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

引用自:https://unix.stackexchange.com/questions/190947