2015-12-21 48 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