我正在尝试编辑 Newick 格式的几个文本文件。为此,有一个物种名称(我想保留)通过下划线连接到一个基因名称(我想删除)。
因此从类似这样的事情开始:
(Species_A_Some_Gene_Code:0.1,Species_B_GeneCode:0.2,(Species_C_Code:0.3,Species_D_Some_code:0.4):0.5);
我想要得到类似的东西:
(Species_A:0.1,Species_B:0.2,(Species_C:0.3,Species_D:0.4):0.5);
我目前使用的sed
方法bash
。我试图匹配一些内容,包括物种名称,直到第一个冒号(:
),但丢弃物种名称和冒号之间的内容。
for i in Species_A Species_B Species_C Species_D; do
sed -i 's;\('"$i"'\)[^:]*\(:.*\);\1\2;p' "/directory/*.txt"
done
我得到的是……奇怪?很难说,因为实际结果更大,但看起来有点像:
(Species_A:0.1,Species_B_GeneCode:0.2,(Species_C_Code:0.3,Species_D_Some_code:0.4):0.5);
(Species_A:0.1,Species_B:0.2,(Species_C_Code:0.3,Species_D_Some_code:0.4):0.5);
(Species_A:0.1,Species_B:0.2,(Species_C:0.3,Species_D_Some_code:0.4):0.5);
(Species_A:0.1,Species_B:0.2,(Species_C_Code:0.3,Species_D:0.4):0.5);
就好像结果被附加而不是替换旧的一样。我猜测这可能与试图匹配的第二组有关sed
,但我不确定。我将感谢您的帮助!
答案1
一定是这样吗sed
?这个怎么样awk
:
awk '
NR==1 {m = split ($0, T)
next
}
{for (i=m; i; i--) sub(T[i] "[^:]*", T[i])
}
1
' - file <<< "Species_A Species_B Species_C Species_D"
(Species_A:0.1,Species_B:0.2,(Species_C:0.3,Species_D:0.4):0.5);
它split
是从“此处字符串”读入数组的种类T
,然后对于从文件中读取的每一行,替换由相应T
元素加上任何非“:”字符组成的每个字符串T
,从而有效地删除非“: ”字符“:“ 东西。