如何从awk中的列中提取文本

时间:2017-02-24 14:48:42

标签: bash unix awk sed

我有以下数据:

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中的任何帮助。

5 个答案:

答案 0 :(得分:4)

您可以使用grep来匹配线条,只打印匹配项

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

-o, - 仅匹配

     

仅打印行的匹配部分。

也可以使用match

中的awk功能完成此操作
$ awk  '{match($0, "rs[[:digit:]]*", arr); print arr[0]}' file
rs16941
rs16942
rs1060915
rs1799966
rs206075

答案 1 :(得分: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

答案 2 :(得分:2)

使用awk:

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

这不应该是gawk,甚至可以在较旧的计算机上使用

答案 3 :(得分:1)

另一个基于awk的解决方案,它使用下划线字符_作为字段分隔符,并打印以rs开头的字段:

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

答案 4 :(得分:0)

你也可以尝试这种方法

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

<强>输出:

rs16941
rs16942
rs1060915
rs1799966
rs206075