発生順序に従って繰り返される単語に連続した文字を追加します。

発生順序に従って繰り返される単語に連続した文字を追加します。

したがって、これらのファイルがありますが、各ファイルには数百の異なる遺伝子があります。

>lcl|accession_cds_proteinaccession [gene=dnaA] [protein=description] [protein_id=accession] [location=location]
ATGTCGGAAAAAGAAATTTGGGAAAAAGTGCTTGAAATTGCTCAAGAAAAATTATCAGCTGTAAGTTACT
CAACTTTCCTAAAAGATACTGAGCTTTACACGATTAAAGATGGTGAAGCTATCGTATTATCGAGTATTCC
TTTTAATGCAAATTGGTTAAATCAACAATATGCTGAAATTATCCAAGCAATCTTATTTGATGTTGTAGGC

繰り返しの遺伝子名が多いため、ファイル全体に gene=dnaA が複数回表示されることがあります。遺伝子名が繰り返される場合、名前の末尾に2が追加されるようにこれが必要です。したがって、ファイルの2番目の重複の場合は[gene = dnaA]が[gene = dnaA2]に変更され、3番目の重複の場合は[gene = dnaA3]が[gene = dnaA3]に変更されます。重要なのは、遺伝子名が6回以上繰り返されないことです。サンプル出力は次のとおりです。

lcl|accession_cds_proteinaccession [gene=dnaA] [protein=description] [protein_id=accession] [location=location]
ATGTCGGAAAAAGAAATTTGGGAAAAAGTGCTTGAAATTGCTCAAGAAAAATTATCAGCTGTAAGTTACT
CAACTTTCCTAAAAGATACTGAGCTTTACACGATTAAAGATGGTGAAGCTATCGTATTATCGAGTATTCC

lcl|accession_cds_proteinaccession [gene=dnaA2] [protein=description] [protein_id=accession] [location=location]
ATGTCGGAAAAAGAAATTTGGGAAAAAGTGCTTGAAATTGCTCAAGAAAAATTATCAGCTGTAAGTTACT
CAACTTTCCTAAAAGATACTGAGCTTTACACGATTAAAGATGGTGAAGCTATCGTATTATCGAGTATTCC

lcl|accession_cds_proteinaccession [gene=dnaA3] [protein=description] [protein_id=accession] [location=location]
ATGTCGGAAAAAGAAATTTGGGAAAAAGTGCTTGAAATTGCTCAAGAAAAATTATCAGCTGTAAGTTACT
CAACTTTCCTAAAAGATACTGAGCTTTACACGATTAAAGATGGTGAAGCTATCGTATTATCGAGTATTCC
TTTTAATGCAAATTGGTTAAATCAACAATATGCTGAAATTATCCAAGCAATCTTATTTGATGTTGTAGGC

awkを使用して繰り返し単語を含む行の末尾に文字を追加する方法への回答をここで見ました(ファイル内の重複項目を見つけて、最初の一致項目の行末に文字を追加したいと思います。)。ただし、繰り返し単語の末尾に文字を追加する必要があります。ここで文字は反復回数を示す。

私に正しい方向を教えてくれれば、大いに役立つでしょう!

ありがとう

ベストアンサー1

パール1行:

perl -pe's/\[gene=([^\]]*)\K\]/$h{$1}++?"$h{$1}]":"]"/e' yourfile

説明する:

  • -p:(保存された)ファイルの各行に対してコードを実行し、$_最後に印刷します。$_
  • -e:コード。
  • s/regex/replacement/e: マッチ正規表現そしてそれに置き換え代替存在する$_

正規表現:

/\[gene=    # match [gene= 
 ([^\]]*)   # match anything but "]" and put it a matching group
 \K         # don't “take” anything until here
 \]         # match a literal ]
/x

代替:

  • condition ? yes : no:古典的な三項演算子(returnがある場合と同じように読み取る)
  • $h{$1}++:最初に一致するグループの内容をハッシュ(dict、map ...)に保存し、値を1ずつ増やします。0最初に見つかった場合はfalseを返します。

  • "$h{$1}]":値を読み取り、$1文字列に挿入します。

ファイル内の置換が必要な場合は、バックアップファイルで終わるオプションのファイルにフラグを付けることができます-i(たとえば、置き換える前に変更して作成します)。perl-iperl -i'.bak' -pe'…' yourfileyourfileyourfile.bak

おすすめ記事