2017-02-24 89 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