如何使用Awk对包含逗号数据的选项卡文件的列进行汇总和排序

时间:2019-06-18 11:07:29

标签: awk

我有一个这样的标签文件,final_score.csv:

fufu  -2  map1,map3,map8
fifi  6   map5,map1
fofo  0   map4
lili  -9  map8,map1

我想创建另一个这样的标签文件:

map8  -11
map1  -5
map3  -2
map4  0
map5  6

所以我需要列出我所有的化合物,并对那些命中率最高的化合物进行汇总,并对它们进行排序。 到目前为止,我已经:

awk -F"\t" '{
  split($3,a,",");
  for(i=1; i in a; i++){
    print a[i],"\t",$2;
  }
}' final_score.csv > bla.csv

awk -F"\t" '$1 {sum+=$2} END {print $1,"\t",sum}' bla.csv

但是它给了我:

map1  -11

我只有文件中的最后一个“地图”和数字列的总和,我该如何解决?

预先感谢

2 个答案:

答案 0 :(得分:2)

awk + sort解决方案:

awk '{ len=split($3, a, ","); for(i=1;i<=len;i++) b[a[i]] += $2; delete a }
      END{ for(i in b) print i, b[i] }' yourfile | sort -k2

输出:

map8 -11
map3 -2
map1 -5
map4 0
map5 6

答案 1 :(得分:0)

直接对输出进行排序的GNU awk版本:

$ gawk '{ split($3, a, ","); for (i in a) b[a[i]] += $2 }
        END { PROCINFO["sorted_in"] = "@val_num_asc"; OFS="\t";
              for (i in b) print i, b[i] }' final_score.tsv
map8    -11
map1    -5
map3    -2
map4    0
map5    6