私は、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]
答え2
使用幸せ(以前のPerl_6)
~$ raku -pe 's/^ \w+ <( \: <[0..9-]>+ //;' file
#OR
~$ raku -pe 's/^ (\w+) \: <[0..9-]>+ /$0/;' file
上記は、Perlシリーズのプログラミング言語であるRakuで書かれた答えです。これら2つの答えは、Rakuのsedに似た自動印刷プログレッシブフラグを使用します(Rakuのawkなどの非自動印刷プログレッシブフラグを-pe
使用する他の答えを想像できます)。-ne
つまり、^
文字列の先頭(行)、\w+
1つ以上の数字、またはアンダースコア、コロン、アラビア数字とハイフンで構成されるカスタム文字クラスが\:
続くことを検出します。 (Unicode番号を含めるには代わりに使用してください)。<[0..9-]>+
-
<+ :N + [-]>+
入力例:
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
サンプル出力(2つのコード例):
gene_A CTCTTTCTTTTACGCCT
gene_A CTCTTTCTTTTACGCCT
gene_A CTCTTTCTTTTACGCCT
gene_B CTCTTTCTTTTACGCCT
gene_B CTCTTTCTTTTACGCCT
gene_C CTCTTTCTTTTACGCCT
各回答の説明:
Rakuの
<(
キャプチャフラグは、コロンより前の一致を削除するために使用されます(キャプチャフラグは単独で機能しますが、一緒に使用できるおよび<(
/または)。)>
残りのキャプチャは、置き換えられた半分で「置き換えられません」、つまり削除されます。Rakuの
(
...)
数字キャプチャ括弧は遺伝子名をキャプチャするために使用され、本質的に後で一致するものを削除します。その後、現在のキャッチは$0
交換ハーフに配置されます。つまり、ゲームの残りの部分が削除されます。
注:本当に「キャッチして修正」(遺伝子名からアンダースコアを削除するなど)が必要な場合は、Rakuを使用して置き換えられた半分でコードを実行できます。以下は、trans
すべての下線を空の文字列(つまり何もなし)に変換し、アンダースコアが削除された遺伝子名を返します。
~$ raku -pe 's/^ (\w+) \: <[0..9-]>+ /{$0.trans("_" => "")}/;' file
#OR (more simply)
~$ raku -pe 's/^ (\w+) \: <[0..9-]>+ /$0.trans("_" => "")/;' file
答え3
sed -E 's/(gene_[A-Z]):[0-9-]+/\1/' input.txt
このコマンドは-E
オプションを使用して拡張正規表現を有効にし、グループの遺伝子IDをキャプチャしてから、(gene_[A-Z])
コロンと一連の数字とダッシュを使用します:[0-9-]+
。代替エントリは\1
元の入力ファイルの遺伝子IDを参照し、このファイルには遺伝子IDのリストとそのシーケンスが含まれています(この例ではinput.txtという名前)。
答え4
この作業は2段階に進みますsed
。
仮定gene.txt
:
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
中間フィールドを削除します(a〜a
:
で区切ってください)。
> sed 's/:.* / /' gene.txt gene_A CTCTTTCTTTTACGCCT gene_A CTCTTTCTTTTACGCCT gene_A CTCTTTCTTTTACGCCT gene_B CTCTTTCTTTTACGCCT gene_B CTCTTTCTTTTACGCCT gene_C CTCTTTCTTTTACGCCT
このコマンドはコロンから空白まで一致し、すべてを空白に置き換えます。
アンダースコアを削除します(最初のコマンドに追加されます)。
> sed 's/:.* / /;s/_//' gene.txt geneA CTCTTTCTTTTACGCCT geneA CTCTTTCTTTTACGCCT geneA CTCTTTCTTTTACGCCT geneB CTCTTTCTTTTACGCCT geneB CTCTTTCTTTTACGCCT geneC CTCTTTCTTTTACGCCT
このコマンドはセミコロンを使用して2つの独立した代替試行を区別しますが、最初の置換が発生した場合、最初の置換の結果に対して2番目の置換が発生し続けます。このソリューションの「フレーズ」は、最初の下線のみを削除します(代替の
g
末尾にはありません)。