2015-12-21 49 views
2

我尝试|前要计在一个文件中$2独特的数据前,在AWK领域:计数管道符号

文件

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 

所需的输出

尝试:

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

目前,我得到一个非常不同的号码,并认为这是necause我需要拆分的|,但不知道正确的方式来做到这一点。谢谢 :)。

+1

再添子,即'子/ \ | * $ /, “”,$ 0)'。祝你好运。 – shellter

+0

嗯..我也认为你需要调试你的步骤。添加'打印#dbg:= $ 2之前“$ 2'和'打印‘#dbg $ 2 =后’$ 2'在适当的位置应该可以帮助好运 – shellter

回答

3

你是几乎没有。您只需通过\|sub()使用正则表达式替换:

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

您也可以通过这样的分隔符玩法:

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

我使用两种|一个或多个空格作为分隔符。这使得有可能作为$2访问感兴趣的部分。

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

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 
+0

谢谢大家非常:) – Chris