我有一个 .fasta(文本)文件,其中包含以下格式的 DNA 序列数据:
>uce-8374_Genus_species
ACGTACGTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTACGATCGCGGTATATCGGCGATTCGATCG
>uce-239_Genus_species
ATCGTAGCATGCGCTAGCTAGCTAGCTCGCGGTACGCATGTCTGACTGCGTCTGGTCGTACGATTACTACGACTGCG
>uce-83_Genus_species
ATCGATCTAGCGTAGCATGCGATCGATATCTGCGATCGACTCGATGCATGCATGCATCGATGCTAGCTAGCTAGCTA
>uce-902_Genus_species
AGCTGACTAGCTGGCGATACTGGCGATATCGGATTACGCGGCATATCGAGCGAGTCGATCGATGCATCTGATGCAGC
我正在尝试将所有内容附加到第一的下划线,前面有一个,|
只有行尾有>
。因此,例如,第一个序列将读取:
uce-8374_Genus_species|uce-8374
,后面是它下面的 DNA 序列。有没有办法在 sed 中做到这一点?我尝试将其存储^[^_]+(?=_)
到变量中,但它不起作用,只是一直附加^[^_]+(?=_)
到行尾而不是模式本身。任何帮助以及解释(因为我是正则表达式的新手)都会有所帮助。如果有更好的方法可以解决这个问题,我愿意接受其他选择!
到目前为止,我已经尝试过(我只会展示第一个 DNA 序列,但我想改变它们全部):
sed -E 's/species/species|^[^_]+(?=_)/' sample_file.fasta
结果:uce-8374_Genus_species|^[^_]+(?=_)
我也尝试过:
x="^[^_]+(?=_)"
sed -E "s/species/species|$x/" "sample_file.fasta"
结果:uce-8374_Genus_species|^[^_]+(?=_)
答案1
与 Perl 不同,sed 不支持 PCRE 前瞻语法,(?=_)
但您可以按如下方式模拟它:
- 匹配
>
固定在行首^>
- 然后匹配并捕获零个或多个非
_
字符([^_]*)
- 然后匹配其他所有内容
.*
然后替换为
- 整个匹配的模式
&
- 接下来是文字
|
,然后是第一个捕获的组\1
所以
$ sed -E 's/^>([^_]*).*/&|\1/' sample_file.fasta
>uce-8374_Genus_species|uce-8374
ACGTACGTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTAGCTACGATCGCGGTATATCGGCGATTCGATCG
>uce-239_Genus_species|uce-239
ATCGTAGCATGCGCTAGCTAGCTAGCTCGCGGTACGCATGTCTGACTGCGTCTGGTCGTACGATTACTACGACTGCG
>uce-83_Genus_species|uce-83
ATCGATCTAGCGTAGCATGCGATCGATATCTGCGATCGACTCGATGCATGCATGCATCGATGCTAGCTAGCTAGCTA
>uce-902_Genus_species|uce-902
AGCTGACTAGCTGGCGATACTGGCGATATCGGATTACGCGGCATATCGAGCGAGTCGATCGATGCATCTGATGCAGC