AWK-匹配后对特定字段求和

AWK-匹配后对特定字段求和,awk,Awk,我有一个10到数百行长的txt文件,如果前面的字段匹配,我需要对每行(和输出)的一个特定字段求和 以下是一个示例数据集: Sample4;6a0f64d2;size=1;,Sample4;f1cb4733a;size=6;,Sample3;aa44410feb29210c1156;size=2; Sample2;5b91bef2329bd87f4c7;size=2;,Sample1;909cd4e2940f328b3;size=2; 结构是 ;;大小=然后是下一个条目。一行中可能有数百个条目(

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

以下是一个示例数据集:

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

;;大小=然后是下一个条目。一行中可能有数百个条目(这只是一个小示例)

基本上,我希望对一行中每个条目(条目以“,”分隔)的“大小”数字求和,但只对与特定样本标识符匹配的条目求和(例如sample4)
因此,如果我们只想匹配“Sample4”,脚本将生成以下内容-

awk '{some-code for sample4}' example.txt
7
0
因为第1行中带“Sample4”的条目加起来有7个,但在第2行中,没有匹配的Sample4条目

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

Sample1  Sample2  Sample3  Sample4
0        0        2        7  
2        2        0        0
关于如何开始有什么想法吗


谢谢

如果我理解正确,您可以:

$ 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

如果我理解正确,您可以:

$ 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

另一个
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

awk-F';“”{对于(i=1;i另一个
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

awk-F';“{for(i=1;iIf)一行中可以有“数百个条目”
\n
的逻辑功能是什么?单独的行有什么意义吗?每行对应于不同的分类单元或有机体。因此,此脚本的目标是对每行(分类单元)给定样本ID的发生率求和/计数如果“一行中有数百个条目”,那么
\n
的逻辑功能是什么?单独的行有什么意义吗?每一行对应一个不同的分类单元或有机体。因此,此脚本的目标是对每一行(分类单元)给定样本ID的发生率进行汇总/计数太棒了…你能快速解释一下那里发生了什么吗?太棒了…你能快速解释一下那里发生了什么吗?