根据出现的顺序将连续的字符添加到重复的单词中

根据出现的顺序将连续的字符添加到重复的单词中

所以我有这样的文件,但每个文件有数百个不同的基因。

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

有很多重复的基因名称,因此gene=dnaA 可能在整个文件中出现几次。我需要这样,如果基因名称重复,则会在名称末尾添加 2。因此,对于文件中的第二个重复项,它将 [gene=dnaA] 更改为 [gene=dnaA2],对于第三个重复项,它将 [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

Perl 一行:

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 的 if)
  • $h{$1}++:将第一个匹配组的内容存储在哈希(字典、映射...)中,并将值加一。返回0,第一次遇到时为 false。

  • "$h{$1}]":读取值$1并将其插入字符串中。

如果您想要文件内替换,请-iperl.您可以向标志提供一个以备份文件结尾的可选文件-i(例如,在替换之前perl -i'.bak' -pe'…' yourfile更改yourfile并创建一个from )。yourfile.bak

相关内容