我正在尝试计算$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
目前,我得到了一个非常不同的数字并认为这是因为我需要拆分|
但不确定正确的方法。谢谢你:)。
答案 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
。