所以我有这样的文件,但每个文件有数百个不同的基因。
>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
并将其插入字符串中。
如果您想要文件内替换,请-i
在perl
.您可以向标志提供一个以备份文件结尾的可选文件-i
(例如,在替换之前perl -i'.bak' -pe'…' yourfile
更改yourfile
并创建一个from )。yourfile.bak