我正在尝试解析如下所示的输入:
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
换句话说,我将第一个“_”之前的名称提取到第一列,并将 chr 之后的部分提取到第二列(类似于第三列和第四列)。
我编写了适用于前四列的命令:
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/'
因此,我想使用正则表达式来匹配非空格或制表符,但我无法弄清楚。