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]

ダンチャメンベルギー

答え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

各回答の説明:

  1. Rakuの<(キャプチャフラグは、コロンより前の一致を削除するために使用されます(キャプチャフラグは単独で機能しますが、一緒に使用できるおよび<(/または)。)>残りのキャプチャは、置き換えられた半分で「置き換えられません」、つまり削除されます。

  2. 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

https://docs.raku.org/言語/regexes
https://raku.org

答え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
  1. 中間フィールドを削除します(a〜a:で区切ってください)。

    > sed 's/:.* / /' gene.txt
    gene_A CTCTTTCTTTTACGCCT
    gene_A CTCTTTCTTTTACGCCT
    gene_A CTCTTTCTTTTACGCCT
    gene_B CTCTTTCTTTTACGCCT
    gene_B CTCTTTCTTTTACGCCT
    gene_C CTCTTTCTTTTACGCCT
    

    このコマンドはコロンから空白まで一致し、すべてを空白に置き換えます。

  2. アンダースコアを削除します(最初のコマンドに追加されます)。

    > sed 's/:.* / /;s/_//' gene.txt
    geneA CTCTTTCTTTTACGCCT
    geneA CTCTTTCTTTTACGCCT
    geneA CTCTTTCTTTTACGCCT
    geneB CTCTTTCTTTTACGCCT
    geneB CTCTTTCTTTTACGCCT
    geneC CTCTTTCTTTTACGCCT
    

    このコマンドはセミコロンを使用して2つの独立した代替試行を区別しますが、最初の置換が発生した場合、最初の置換の結果に対して2番目の置換が発生し続けます。このソリューションの「フレーズ」は、最初の下線のみを削除します(代替のg末尾にはありません)。

関連情報