Awk 使用特定模式选择列,然后查找总和和比率
我想根据下面的数据计算总和和比率值。(实际数据包含超过200000列和45000行(行)) 为了清楚起见,我只给出了简单的数据格式Awk 使用特定模式选择列,然后查找总和和比率,awk,gawk,Awk,Gawk,我想根据下面的数据计算总和和比率值。(实际数据包含超过200000列和45000行(行)) 为了清楚起见,我只给出了简单的数据格式 #Frame BMR_42@O22 BMR_49@O13 BMR_59@O13 BMR_23@O26 BMR_10@O13 BMR_61@O26 BMR_23@O25 1 1 1 0 1 1 1 1 2 0
#Frame BMR_42@O22 BMR_49@O13 BMR_59@O13 BMR_23@O26 BMR_10@O13 BMR_61@O26 BMR_23@O25
1 1 1 0 1 1 1 1
2 0 1 0 0 1 1 0
3 1 1 1 0 0 1 1
4 1 1 0 0 1 0 1
5 0 0 0 0 0 0 0
6 1 0 1 1 0 1 0
7 1 1 1 1 0 0 0
8 1 1 1 0 0 0 0
9 1 1 1 1 1 1 1
10 0 0 0 0 0 0 0
需要使用某些标准来选择列
我所考虑的列数据仅为“<强> @ O13>”列。下面我给出了上面示例中的选定列
BMR_49@O13 BMR_59@O13 BMR_10@O13
1 0 1
1 0 1
1 1 0
1 0 1
0 0 0
0 1 0
1 1 0
1 1 0
1 1 1
0 0 0
从所选列中,我要计算:
1) 所有“1”的总和。在本例中,我们得到值16
2) 包含出现“1”的总行数(至少一次)。从上面的示例中,有8行包含至少一个“1”的匹配项
最后,
3) 所有“1”的总数与出现“1”的总行数的比率
即::(所有“1”的总数)/(出现“1”的行总数)。
示例16/8
首先,我尝试使用此命令仅选择带有“@O13”的列
awk'{for(i=1;i这应该可以:
awk 'NR==1{for (i=1;i<=NF;i++) if ($i~/@O13/) a[i];next} {f=0;for (i in a) if ($i) {s++;f++};if (f) r++} END {print "number of 1="s"\nrows with 1="r"\nratio="s/r}' file
number of 1=16
rows with 1=8
ratio=2
awk'NR==1{for(i=1;iMr Jotne,非常感谢您的帮助。代码运行良好。但为了更好地理解,我想问一些解释。为什么有NR==1?它有什么作用?下一步[if(f)r++].这一行的含义是什么?NR==1
只对第一行运行,因此它用于查找哪些列包含O13
,并将其存储到数组a
。如果行中至少有一个1
,则设置标志f
。然后,这if(f)r++
统计至少有一个1
awk 'NR==1{for (i=1;i<=NF;i++) if ($i~/@O13/) a[i];next} {f=0;for (i in a) if ($i) {s++;f++};if (f) r++} END {print "number of 1="s"\nrows with 1="r"\nratio="s/r}' file
number of 1=16
rows with 1=8
ratio=2
awk '
NR==1{
for (i=1;i<=NF;i++)
if ($i~/@O13/)
a[i]
next
}
{
f=0
for (i in a)
if ($i=="1") {
s++
f++
}
if (f) r++
}
END {
print "number of 1="s \
"\nrows with 1="r \
"\nratio="s/r
}
' file