Text-Processing
基於匹配欄位對列求和
我有一個以下格式的大文件:
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