AWK-匹配后对特定字段求和
我有一个10到数百行长的txt文件,如果前面的字段匹配,我需要对每行(和输出)的一个特定字段求和 以下是一个示例数据集: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; 结构是 ;;大小=然后是下一个条目。一行中可能有数百个条目(
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的发生率进行汇总/计数太棒了…你能快速解释一下那里发生了什么吗?太棒了…你能快速解释一下那里发生了什么吗?