使第二列唯一并将它们各自的值添加到第一列中

使第二列唯一并将它们各自的值添加到第一列中

我的输入如下所示,我需要仅保留第二列中的唯一字符串,其中第一列将成为每个唯一字符串的所有值的总和。

例如:取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 }'

相关内容