![将列添加到重复列总和的 awk 命令](https://linux22.com/image/187376/%E5%B0%86%E5%88%97%E6%B7%BB%E5%8A%A0%E5%88%B0%E9%87%8D%E5%A4%8D%E5%88%97%E6%80%BB%E5%92%8C%E7%9A%84%20awk%20%E5%91%BD%E4%BB%A4.png)
我有一个数据集选项卡,如下所示:
A B C D
1 aaa 1 2
1 aaa 3 4
1 aaa 5 6
1 bbb 7 8
1 ccc 9 1
1 ccc 2 3
1 ddd 4 5
1 ddd 6 7
1 ddd 8 9
1 ddd 1 2
我想添加一个新的 E 列来显示分组 B 的 C 总和
期望的输出:
A B C D E
1 aaa 1 2 9
1 aaa 3 4 9
1 aaa 5 6 9
1 ddd 4 5 19
1 ddd 6 7 19
1 ddd 8 9 19
1 ddd 1 2 19
答案1
awk 'BEGIN{ FS=OFS="\t" }
NR==FNR{
if (FNR>1) a[$2]+=$3
next
}
{ $(NF+1)=(FNR==1 ? "E" : a[$2]) }
1
' file file
读取输入文件两次。在第一次运行中,跳过标题行 ( if (FNR>1)...
) 并将 field 的值添加到带有 key 的$3
数组的值中。继续记录。a
$2
next
在第二次运行中,为第一行分配E
新字段或为其他行分配$(NF+1)
的值。a[$2]
打印记录。
输出:
A B C D E
1 aaa 1 2 9
1 aaa 3 4 9
1 aaa 5 6 9
1 bbb 7 8 7
1 ccc 9 1 11
1 ccc 2 3 11
1 ddd 4 5 19
1 ddd 6 7 19
1 ddd 8 9 19
1 ddd 1 2 19