2011-06-17 16 views
1

我有一个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命令行有什么建议?

+0

与制表符分隔的,但是一列? – 2011-06-17 10:56:57

+0

嗨,约翰!它可以在一列中,但用短划线( - )分隔。理想情况下希望将它们放在不同的列中。 – Angelo 2011-06-17 11:00:00

+0

“chr22”部件始终是静态的吗? – Sorpigal 2011-06-17 11:18:54

回答

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:再次更新为任何数字序列号的工作。

2
grep "NM" yourfiname | cut -d_ -f3 | sed 's/[/\d]*/NM_/' 
grep "NR" yourfiname | cut -d_ -f3 | sed 's/[/\d]*/NR_/' 
1
cat file|sed s/$.*!(NR)//; 

使用正则表达式的NR

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]+