使用特定的模式选择列,然后找到之和比(Selecting columns using specifi

2019-10-22 07:05发布

我想计算从下面的数据的总和和比值。 (实际的数据包含超过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”(至少一次)发生总的行数。 从上面的例子有含有的“1”的至少一个发生8行。

最后,

3)总的所有“1”,总线以“1”发生的比率。

也就是说::(所有“1”的)/(具有“1”的次数总行)。 例如16/8

作为一个开始,我试图用这个命令只选择“@ O13”

awk '{for (i=1;i<=NF;i++) if (i~/@O13/); print ""}' $file2

虽然这种运行,但不显示的值。

Answer 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


文章来源: Selecting columns using specific patterns then finding sum and ratio
标签: awk gawk