如何输出活动/非活动输入列表的计数?

时间:2013-11-27 07:57:19

标签: arrays linux if-statement awk

我有这个输入文件(1 =有效,0 =无效)

a  1
a  0                    
b  1                      
b  1
b  0
c  0 
c  0
c  0
c  0
.
.
.

想要这样的输出:

 X       repeats            active count    inactive count
 a       2 times                 1               1 
 b       3 times                 2               1 
 c       4 times                 0               4 

我试过了:

awk -F "," '{if ($2==1) a[$1]++; } END { for (i in a); print i, a[i] }'file name

但那不起作用。
我如何获得输出?

5 个答案:

答案 0 :(得分:3)

只是为了让你知道这个awk应该有效:

awk '$2{a[$1]++; next} {b[$1]++; if (!($1 in a)) a[$1]=0} END{for (i in a) print i, a[i], b[i], (a[i]+b[i])}' file
a 1 1 2
b 2 1 3
c 0 4 4

您可以格式化所需的输出方式。

答案 1 :(得分:1)

你可以尝试

awk -f r.awk input.txt

其中input.awk是您的数据文件,r.awk

{
    X[$1]++
    if ($2) a[$1]++
    else ia[$1]++
}
END {
    printf "X\tRepeat\tActive\tInactive\n"
    for (i in X) {
        printf "%s\t%d\t%d\t%d\n", i, X[i], a[i], ia[i]
    }
}

答案 2 :(得分:1)

这是GNU

awk '{a[$1]++; if ($2!=0) {b[$1]++;c[$1]+=0} else {c[$1]++;b[$1]+=0}}END {for (i in a) print i, a[i], b[i], c[i]}' file

答案 3 :(得分:1)

以下是使用awk

执行此操作的另一种简单方法
awk '{a[$1]++;b[$1]+=$2} END { for (i in a) print i,a[i],b[i],a[i]-b[i]}' file
a 2 1 1
b 3 2 1
c 4 0 4

不需要测试,只需将列$ 2加起来就可以得到命中数。

答案 4 :(得分:1)

awk '
{ repeats[$1]++; counts[$1,$2]++ }
END {
    for (key in repeats)
        print key, repeats[key], counts[key,1]+0, counts[key,0]+0
}
' file