私は、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]