我有 x 个读段的 fasta 文件,我想重命名每个读段的 ID。 我的档案如下:
>e855552f-9484-4674-8fc4-d9b1f1add023 runid=4140cbe7f7cd36a17a00b732f27dd37bd09e4380 sampleid=mariposas read=55861 ch=2 start_time=2022-11-23T17:43:40Z model_version_id=2021-05-17_dna_r9.4.1_minion_768_2f1c8637 barcode=barcode06
GCTTTAACATTTAGCTATTTATGACACAGTGAAATAAAAGTAATATCTTTTTATTTTTAATTGTATTTATTAGTTACATGTTTTCACATGCATTTAACATAAATGTGATAATTTATGGGAATTACACTACTGTCAAAGTAGTT
>c9d90319-ec63-4347-9244-ad080b0815c5 runid=4140cbe7f7cd36a17a00b732f27dd37bd09e4380 sampleid=mariposas read=30196 ch=317 start_time=2022-11-23T14:47:32Z model_version_id=2021-05-17_dna_r9.4.1_minion_768_2f1c8637 barcode=barcode11
GCCTTGACTATATGGTTTACCTGTTCAAATACGACTCTACTCATGGTCGTTTCAAGGGAACAGTTGAGGTTCAAGGATGGTTTCCTCGTAGTAGTCTCAATGGAAACAAATCTCCTGTCTTCTGTGAAAGAGACCCTAAAATC
我想用第一个 ID 和由“_”链接的条形码(最后一个词)重命名读数。
我的期望是:
>e855552f-9484-4674-8fc4-d9b1f1add023_barcode06
GCTTTAACATTTAGCTATTTATGACACAGTGAAATAAAAGTAATATCTTTTTATTTTTAATTGTATTTATTAGTTACATGTTTTCACATGCATTTAACATAAATGTGATAATTTATGGGAATTACACTACTGTCAAAGTAGTT
>c9d90319-ec63-4347-9244-ad080b0815c5_barcode11
GCCTTGACTATATGGTTTACCTGTTCAAATACGACTCTACTCATGGTCGTTTCAAGGGAACAGTTGAGGTTCAAGGATGGTTTCCTCGTAGTAGTCTCAATGGAAACAAATCTCCTGTCTTCTGTGAAAGAGACCCTAAAATC
我正在尝试使用
sed
命令,但我不知道它是否是最佳选择。我不知道如何用 sed 而不是固定词来指定多个词(第一个和最后一个)。
使用这个 Perl 单行代码:
perl -lpe 's{^(>\S+).*barcode=(\S+)}{$1_$2}' input.fa > output.fa
或就地更改文件:
perl -i.bak -lpe 's{^(>\S+).*barcode=(\S+)}{$1_$2}' input.fa
Perl 单行代码使用这些命令行标志:
-e
:告诉 Perl 查找内联代码,而不是在文件中。-p
:一次循环输入一行,默认情况下将其分配给$_
。在每次循环迭代后添加print $_
。-l
:在执行内联代码之前去除输入行分隔符(默认情况下在 *NIX 上为"\n"
),并在打印时附加它。-i.bak
:就地编辑输入文件(覆盖输入文件)。在覆盖之前,通过在其名称后附加扩展名 .bak
来保存原始文件的备份副本。如果你想跳过写备份文件,只需使用-i
并跳过扩展名。
s{PATTERN}{REPLACEMENT}
:用PATTERN
代替REPLACEMENT
。^
: 行首。\S+
:非空白字符重复 1 次或多次。(...)
:括号将其中匹配的模式捕获到匹配变量中:$1
,$2
等。
.*
:任何字符重复 0 次或多次。
perldoc perlrun
:如何执行Perl解释器:命令行开关perldoc perlre
:Perl正则表达式(regexes)perldoc perlre
:Perl正则表达式(regexes):量词;字符类和其他特殊转义;断言;捕获组perldoc perlrequick
:Perl正则表达式快速入门