sed 意外附加输出

sed 意外附加输出

我正在尝试编辑 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,从而有效地删除非“: ”字符“:“ 东西。

相关内容