【问题标题】:AWK - sum particular fields after matchAWK - 匹配后对特定字段求和
【发布时间】:2017-05-01 08:29:45
【问题描述】:

我有一个 10 到数百行长的 txt 文件,如果前面的字段匹配,我需要对每一行(和输出)的特定字段求和。

这是一个示例数据集:

Sample4;6a0f64d2;size=1;,Sample4;f1cb4733a;size=6;,Sample3;aa44410feb29210c1156;size=2;
Sample2;5b91bef2329bd87f4c7;size=2;,Sample1;909cd4e2940f328b3;size=2;

结构是

<sample ID>;<random id>;size=<numeric>;, 然后是下一个条目。一行可能有数百个条目(这只是一个小例子)

基本上,我想将一行中每个条目的“大小”数字相加(以“,”分隔的条目),但只有那些与特定样本标识符匹配的数字(例如 sample4)
所以,如果我们只想匹配“Sample4”,脚本会生成这个——

awk '{some-code for sample4}' example.txt
7
0

因为第 1 行中带有“Sample4”的条目加起来为 7,但在第 2 行中,没有 Sample4 条目匹配。

这可以为每个“SampleID”完成,或者理想情况下,为列表中提供的所有样本 ID 完成(可能在简单文件中,每个样本 ID 1 行),然后输出每行的计数,每个具有自己的列的样本 ID - 例如对于上面的示例文件,脚本的结果是:

Sample1  Sample2  Sample3  Sample4
0        0        2        7  
2        2        0        0

关于如何开始的任何想法?

谢谢!

【问题讨论】:

  • 如果“一行中有数百个条目”,\n 的逻辑功能是什么?单独的行是否意味着什么?
  • 每一行对应一个不同的分类单元或有机体。因此,此脚本的目标是对每行(分类单元)的给定样本 ID 的出现次数进行求和/计数

标签: awk


【解决方案1】:

另一个awk

 awk -F';' '{for(i=1;i<NF-1;i+=3) 
               {split($(i+2),e,"="); 
                sub(/,/,"",$i); 
                header[$i]; 
                a[$i,NR]+=e[2]}} 
        END {for(h in header) printf "%s", h OFS; 
             print "";
             for(i=1;i<=NR;i++) 
               {for(h in header) printf "%s", a[h,i]+0 OFS;
                print ""}}' file | column -t


Sample1  Sample2  Sample3  Sample4
0        0        2        7
2        2        0        0

ps。不保证列的顺序。

说明 为了简化解析,我使用; 作为分隔符,并在名称前去掉了,。使用结构为使用多维数组a 的每一行分配名称=总和,分别跟踪标题数组中的所有名称。一旦使用了这些行,在 END 块中打印标题,并为每行打印相应名称的值(如果缺失,则为 0)。 column -t 的漂亮打印。

【讨论】:

  • 太棒了...你能快速解释一下那里发生了什么吗?
【解决方案2】:

如果我理解正确,你可以这样做:

$ awk '{split($0,samp,/,/)
      for (i=1; i in samp; i++){
        sub(/;$/, "", samp[i])
        split(samp[i], fields, /;/)
        split(fields[3], ns, /=/)
        data[fields[1]]+=ns[2]
     }
      printf "For line %s:\n", NR
      for (e in data)
           print e, data[e]
      split("", data)  
 }' file

打印:

For line 1:
Sample3 2
Sample4 7
For line 2:
Sample1 2
Sample2 2

【讨论】:

    猜你喜欢
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多