我的输入如下所示,我需要仅保留第二列中的唯一字符串,其中第一列将成为每个唯一字符串的所有值的总和。
例如:取OIA
第二列中的 并添加第一列中 OIA 的相应值并在 之前打印OIA
。
输入:
1079 OIA
1079 OIA
975 OIA
975 OIA
372 CLN
243 TLN
224 TLN
224 TLN
224 TLN
224 TLN
224 TLN
224 TLN
224 TLN
224 TLN
224 TLN
224 TLN
预期输出:
4108 OIA
372 CLN
2483 TLN
答案1
awk '{m[$2]+=$1}END{for(i in m)print m[i],i}' file
对于大多数使用空格分隔列的情况来说,这应该可以正常工作。
答案2
假设您的输入始终按第二列值分组,如示例输入所示:
$ awk '$2!=prev{if (NR>1) print sum, prev; sum=0; prev=$2} {sum+=$1} END{print sum, prev}' file
4108 OIA
372 CLN
2483 TLN
上面的代码几乎不会在内存中保留任何内容,因此适用于任意大的文件,并且将以与输入 $2 值相同的顺序生成输出。
答案3
假设数据在第二列上排序,使用 GNU datamash
:
datamash -W groupby 2 sum 1 <file
这会将输入读取为空格分隔的字段,按第二个字段对数据进行分组,并对每组的第一个字段求和。
问题中给出的数据的输出将以制表符分隔:
CLN 372
OIA 4108
TLN 2483
请注意,这些字段与问题中预期的字段进行了交换。要解决此问题,还要对第二个字段上的输入数据进行排序(以防它可能不像问题中那样整齐地排序):
sort -b -k 2,2 file | datamash -W groupby 2 sum 1 | awk -v OFS='\t' '{ print $2, $1 }'