sed コマンドは、パターンに続く行の単語を置き換えるために使用されます。

sed コマンドは、パターンに続く行の単語を置き換えるために使用されます。

私は、50,000を超える遺伝子ID行とその配列を含む次のファイルを作業しています。

gene_A:3342234 CTCTTTCTTTTACGCCT
gene_A:1244-5205 CTCTTTCTTTTACGCCT
gene_A:1838438 CTCTTTCTTTTACGCCT
gene_B:1848584 CTCTTTCTTTTACGCCT
gene_B:1029-4920 CTCTTTCTTTTACGCCT
gene_C:3849029 CTCTTTCTTTTACGCCT

これらのすべてに遺伝子IDがあり、その後にコロン、7〜9桁の参照番号、および(一部はダッシュを含む)が続きます。

geneA遺伝子IDをなどの実際の名前に変更し、geneBその背後にある情報を維持したいと思います。希望の出力:

geneA CTCTTTCTTTTACGCCT
geneA CTCTTTCTTTTACGCCT
geneA CTCTTTCTTTTACGCCT
geneB CTCTTTCTTTTACGCCT
geneB CTCTTTCTTTTACGCCT
geneB CTCTTTCTTTTACGCCT

sedを初めて使用するので、どこから始めるべきかわかりません。 gene_Aを含むすべての行を置き換える方法を知っていますが、's/gene_A.*/geneA/'遺伝子IDの後にある情報を保存する方法がわかりません。

ベストアンサー1

私はあなたの例が良くないと思います。実際には、次のファイルを使用してプログラムに変換するのではなく、遺伝子IDを遺伝子名にマップする必要があります。

$ cat ids2names
gene_A when
gene_B chapmen
gene_C billies

その場合は、awkを使用して次のことができます。

$ awk -F'[: ]' 'NR==FNR{map[$1]=$2; next} {print map[$1], $3}' ids2names file
when CTCTTTCTTTTACGCCT
when CTCTTTCTTTTACGCCT
when CTCTTTCTTTTACGCCT
chapmen CTCTTTCTTTTACGCCT
chapmen CTCTTTCTTTTACGCCT
billies CTCTTTCTTTTACGCCT

そうではなく、遺伝子名が実際に_削除された例のように遺伝子IDである場合...

すべてのsedを使用してください:

$ sed 's/_\([^:]*\)[^ ]*/\1/' file
geneA CTCTTTCTTTTACGCCT
geneA CTCTTTCTTTTACGCCT
geneA CTCTTTCTTTTACGCCT
geneB CTCTTTCTTTTACGCCT
geneB CTCTTTCTTTTACGCCT
geneC CTCTTTCTTTTACGCCT

または任意の奇妙な:

$ awk -F'[_: ]' '{print $1 $2, $4}' file
geneA CTCTTTCTTTTACGCCT
geneA CTCTTTCTTTTACGCCT
geneA CTCTTTCTTTTACGCCT
geneB CTCTTTCTTTTACGCCT
geneB CTCTTTCTTTTACGCCT
geneC CTCTTTCTTTTACGCCT

入力の空白が常に単一の空白でない場合は、-F'[: ]'awkスクリプトのOR -F'[:[:blank:]]+'(存在する場合はそのままにしてください)とsedスクリプトのORに変更します。-F'[: \t]+'_[^ ][^[:blank:]][^ \t]

ダンチャメンベルギー

おすすめ記事