在管道符号之前按awk中的字段计数

时间:2015-12-21 18:39:49

标签: awk

我正在尝试计算$2之前文件中|中的唯一条目:

文件

chr11:101323676-101323847   TRPC6|gc=39.2   143.1
chr11:101324359-101324478   TRPC6|gc=38.7   146.4
chr11:101325731-101325850   TRPC6|gc=32.8   84.5
chr11:101341904-101342127   TRPC6|gc=43.5   197.9
chr12:5153304-5155165   KCNA5|gc=65.1   633.7
chr12:52306230-52306349 ACVRL1|gc=58.8  152.4
chr12:52306868-52307149 ACVRL1|gc=66.5  309.6
chr12:52307328-52307569 ACVRL1|gc=66.8  305.9
chr12:52307743-52307872 ACVRL1|gc=64.3  267.1

所需的输出

3

尝试:

awk '{sub(/:.*/,"",$2)} !seen[$2]++{unq++} END{print unq}' file.txt

目前,我得到了一个非常不同的数字并认为这是因为我需要拆分|但不确定正确的方法。谢谢你:)。

2 个答案:

答案 0 :(得分:4)

awk救援!

$ awk '{split($2,a,"|"); c[a[1]]} 
    END{for(k in c) count++; print count}' file

3

或更短的版本

$ awk '{split($2,a,"|"); if(!c[a[1]]++) count++} 
    END{print count}' file

最短

$ awk 'split($2,a,"|") && !c[a[1]]++{u++} END{print u}' file

答案 1 :(得分:3)

你快到了。您只需要在:中使用的正则表达式中将\|替换为sub()

awk '{sub(/\|.*/,"",$2)}!seen[$2]++{c++}END{print c}' file

你也可以像这样使用分隔符:

awk -F'[|]| +' '!seen[$2]++{c++}END{print c}' file

我使用|一个或多个空格作为分隔符。这样就可以将感兴趣的部分作为$2访问。

其余部分遵循与您的问题中的示例相同的逻辑:我们在查找表$2中使用seen作为索引,并检查此索引是否已出现过。如果没有,我们会增加计数器c,最后我们会打印c