2017-02-24 91 views
1

我有這樣的數據:如何提取列文本在AWK

COSM3755563_(COSMIC),_COSM3755562_(COSMIC),_rs16941_(Gene_file) 
COSM148277_(COSMIC),_COSM3755561_(COSMIC),_rs16942_(Gene_file) 
rs1060915_(Gene_file;_1000Genomes) 
COSM3755560_(COSMIC),_rs1799966_(Gene_file) 
rs206075_(Gene_file;_1000Genomes) 

我需要等的輸出:

rs16941 
rs16942 
rs1060915 
rs1799966 
rs206075 

我只需要在此列中提取rs_number。問題是,rs_number總是在不同的位置。

我的解決辦法是:

awk '{split ($1,arr1,"_"); print arr1[1)}' infile 

這工作完全正常,直到我rs_number的改變位置。

感謝awk的幫助。

+1

,添加一個循環,尋找'rs',即'的awk「{N = split($ 1,arr1,「_」);對於(i = 1; i <= n; i ++){if(arr1 [i]〜/^rs.*/)print arr1 [i}}'infile'(可能需要一個大括號不匹配固定)。祝你好運 – shellter

回答

4

你可以使用grep相匹配的線和只打印了比賽,

$ grep -o "rs[[:digit:]]*" file 
rs16941 
rs16942 
rs1060915 
rs1799966 
rs206075 

-o,--only匹配

只打印線相匹配的部分。


這也可以使用match函數來完成在awk

$ awk '{match($0, "rs[[:digit:]]*", arr); print arr[0]}' file 
rs16941 
rs16942 
rs1060915 
rs1799966 
rs206075 
+0

這是很好的grep實現! – Geroge

+0

rs [[]:digit:] - 這就是我一直在尋找的!驚人!非常感謝! – Geroge

+0

@Geroge不客氣。再加上一點,如果你想確保rs後面跟着至少一個數字,那麼正則表達式可以更好地寫成:rs [[:digit:]] [[:digit:]] *'as '*'匹配零個或多個。希望它有幫助 – nu11p01n73R

4

我會用sed爲:

sed 's/.*\(rs[[:digit:]]\{1,\}\).*/\1/' file 

搜索:

.*    - any character, zero or more times 
\(   - begin of capturing group 
rs    - the literal 'rs' 
[[:digit:]] - a digit ... 
\{1,\}   - ... one or more times (can be \+ if you use GNU sed) 
\)    - end of capturing group 
.*    - any character, zero or more times 

替換:

\1    - Content of capturing group 1 
+0

謝謝sed解決方案..我有另外一個這樣的文本文件的後處理都在awk中實現..所以這是爲了在awk中做到這一點..但我喜歡這個解決方案! – Geroge

+0

'\ +'無論'\ {1,\}'看起來更好imo – FloHe

+0

@Geroge我明白了。 ........ – hek2mgl

2

用awk:

awk 'match($0, /rs[0-9]+/) { print substr($0, RSTART, RLENGTH)}' data 

這不應該需要gawk,並應在較舊的計算機

+0

非常好分享你! – Geroge

1

另一個awk基礎的解決方案,它使用下劃線_作爲甚至工作字段分隔符並打印以rs開頭的字段:

awk -F'_' '{for(i=1;i<=NF;i++){if($i ~/^rs/){print $i}}}' file 
rs16941 
rs16942 
rs1060915 
rs1799966 
rs206075 
0

你可以試試這個方法也

sed 's/.*\(rs[^\_]\+\).*/\1/' fileName 

輸出:使用你的代碼

rs16941 
rs16942 
rs1060915 
rs1799966 
rs206075