我有一个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_开始的值 像
NR_021492 NM_005198 NM_152247 NM_152253
NR_021492 NM_005198
在制表符分隔文件
中对bash命令行的任何建议?
答案 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]+