在文件中查找模式

时间:2011-06-17 10:43:15

标签: bash shell unix

我有一个500行和一列的txt文件。

每一行中的列都会出现类似的内容(例如我粘贴两行):

chr22:49367820-49368570_NR_021492_LOC100144603,chr22:49368010-49368760_NM_005198_CHKB,chr22:49368010-49368760_NM_152247_CPT1B,chr22:49368010-49368760_NM_152253_CHKB    

chr22:49367820-49368570_NR_021492_LOC100144603,chr22:49368010-49368760_NM_005198_CHKB

想要从每行中提取从NM_或NR_开始的值 像

  • 第1行有NR_021492 NM_005198 NM_152247 NM_152253
  • 第2行有NR_021492 NM_005198
  • ...

在制表符分隔文件

对bash命令行的任何建议?

4 个答案:

答案 0 :(得分:2)

grep "NM" yourfiname | cut -d_ -f3 | sed 's/[/\d]*/NM_/'
grep "NR" yourfiname | cut -d_ -f3 | sed 's/[/\d]*/NR_/'

答案 1 :(得分:2)

尝试:

 sed -r -e 's/chr[0-9]+:[^_]*_(N[RM])_([0-9]+)_[^,_]+([, ]|$)/\1_\2'$'\t''/g;s/'$'\t''$//g'

假设GNU sed。

所以

sed -r -e 's/chr[0-9]+:[^_]*_(N[RM])_([0-9]+)_[^,_]+([, ]|$)/\1_\2'$'\t''/g;s/'$'\t''$//g' your_file > tab_delimited_file

编辑:更新为不在每行留下一个尾随制表符。

编辑2:再次更新以适用于任何chr-then-number序列。

答案 2 :(得分:1)

cat file|sed s/$.*!(NR)//;

使用正则表达式删除NR之前的所有内容

答案 3 :(得分:1)

awk -F '[,:_-]' '{
    for (i=1; i<NF; i++) 
        if ($i == "NR" || $i == "NM") 
            printf("%s_%s ", $i, $(i+1))
    print ""
}'

这也可以,但会在各自的行上打印每个匹配:egrep -o 'N[RM]_[0-9]+