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);

前の結果を置き換えるのではなく、結果が追加されるのと同じです。私はこれが2番目のグループが一致しようとしているものと関係があると思います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"char"以外の文字を効果的に削除します。

おすすめ記事