首页 > 解决方案 > 添加字段的数字

问题描述

我有一个包含多行和两列或四列的文本文件。如果有两列,则第一列是 id,第二列是数字,如果四列第一和第二列是 id,第三和第四列是数字。对于四列行,第 2 列和第 4 列单元格可以有多个条目,以逗号分隔。如果只有两列,我想按原样打印它们;但是如果有四列,我只想打印第一列 id,而在第二列中,我想要该行的第三列和第四列中存在的所有数字的总和。

输入

    CG  AT,AA,CA    17  1,1,1
    GT  14
    TB  AC,TC,TA,GG,TT,AR,NN,NM,AB,AT,TT,TC,CA,BB,GT,AT,XT,MT,NA,TT         552 6,1,1,2,2,1,2,1,5,3,4,1,2,1,1,1,3,4,5,4
    TT  CG,GT,TA,GB 105 3,4,1,3

预期产出

    CG  20
    GT  14
    TB  602
    TT  116

标签: awk

解决方案


如果实际文件中没有前导空格,请$1使用$2.

$ awk -F '[ ,]+' '{for(i=1; i<=NF; i++) s+=$i; print $2, s; s=0}' <<EOF
    CG  AT,AA,CA    17  1,1,1
    GT  14
    TB  AC,TC,TA,GG,TT,AR,NN,NM,AB,AT,TT,TC,CA,BB,GT,AT,XT,MT,NA,TT         552 6,1,1,2,2,1,2,1,5,3,4,1,2,1,1,1,3,4,5,4
    TT  CG,GT,TA,GB 105 3,4,1,3
EOF

CG 20
GT 14
TB 602
TT 116
  • -F '[ ,]+'表示“字段由一个或多个空格或逗号分隔”。

  • 没有与 相关的条件{action},因此它将在每一行上执行。

  • NF是字段数,$X指的是第 X 个字段。

  • 字符串等于 0,所以我们可以简单地将每个字段相加得到一个总和。

  • 在我们打印第一个非空白字段和​​我们的总和后,我们重置下一行的总和。


推荐阅读