2013-03-20 276 views
0

我试图解析输入,看起来像这样:sed的正则表达式匹配非空白或标签

i171_chr1_C_MSTA_K0.184_full i266_chr1_+_MSTA_K0.195_full 92.06 2255 125 21 1 2221 2235 1 0.0 3123 
i172_chr1_+_MLT1D_K0.575_full i172_chr1_+_MLT1D_K0.575_full 100.00 2290 0 0 1 2290 1 2290 0.0 4229 
i172_chr1_+_MLT1D_K0.575_full i172_chr1_+_MLT1D_K0.575_full 100.00 2290 0 0 1 2290 1 2290 0.0 4229 

所需的输出是:

i171 1 i266 1 92 
i172 1 i172 1 100 
i172 1 i172 1 100 

换句话说,我才第一次提取名“_”到第一列和第二列后的部分(类似于第三和第四列)。

我写的命令可以正常工作的前四列:

grep -v "#" blastGE90_lengthGE1000 | cut -f 1,2 | sed -r 's/(.+)_chr([0-9XY]+)_.+\t(.+)_chr([0-9XY]+).+/\1 \2 \3 \4/' 

然而,当我尝试匹配输入第三列,我没有成功。我总是匹配的最后一场比赛,而不是一个我想:

grep -v "#" blastGE90_lengthGE1000 | cut -f 1,2 | sed -r 's/(.+)_chr([0-9XY]+)_.+\t(.+)_chr([0-9XY]+).+([0-9]+\.).+/\1 \2 \3 \4 \5/' 

所以,我想用正则表达式匹配非空白或制表,但我无法弄清楚。

回答

3

我有固定的命令:

grep -v "#" blastGE90_lengthGE1000 | cut -f 1-3 | sed -r 's/(.+)_chr([0-9XY]+)_.+\t(.+)_chr([0-9XY]+)_.+\t([0-9]+).+/\1 \2 \3 \4 \5/' 

您需要使用cut -f 1-3cut -f 1,2因为你需要的前三列。 我还修复了sed表达式中的最后一个捕获组。

+0

这样一个愚蠢的错误:(非常感谢你! – Perlnika 2013-03-20 14:22:03

1

我会在这里使用awk

$ awk -F'_| +' '{gsub(/chr/,"");print $1,$2,$7,$8,int($13)}' file 
i171 1 i266 1 92 
i172 1 i172 1 100 
i172 1 i172 1 100 
+0

也工作,谢谢。另外感谢你的多个分隔符的想法,一定会使用一天。 – Perlnika 2013-03-20 14:24:54