Awk 使用特定模式选择列,然后查找总和和比率

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

我想根据下面的数据计算总和和比率值。(实际数据包含超过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           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