使用映射 TXT 文件重命名 FASTA 文件

renaming fasta file using a mapping txt file

提问人:Geomicro 提问时间:10/31/2023 最后编辑:Timur ShtatlandGeomicro 更新时间:10/31/2023 访问量:64

问:

编辑解决方案:https://tejashree1modak.github.io/bioblogs/fasta_rename/

我希望使用 unix 中的scaffold_mapping.txt文件重命名我的脚手架,其中.txt文件如下所示:

$ head scaffold_mapping.txt 
>#ID_covAvg_fold_lengthLength
>scaffold_1_c1_cov61.3780_length417825
>scaffold_3_c1_cov45.0025_length77714
>scaffold_4_c1_cov84.2432_length70007
>scaffold_5_c2_cov57.6219_length67890
>scaffold_6_c1_cov331.1665_length65908
>scaffold_7_c1_cov138.5574_length64984
>scaffold_9_c1_cov77.1170_length59223
>scaffold_2_c2_cov51.1554_length55365
>scaffold_11_c1_cov44.1476_length53538

fasta 文件中的每个脚手架当前都按如下方式命名:

> scaffold_1_c1

我希望他们的名字与scaffold_mapping.txt文件匹配,以便前面的例子是:

> scaffold_1_c1_cov61.3780_length417825

我希望 sed 会很容易,但“>”使事情复杂化

$ sed -f scaffold_mapping1.txt assembly.contigs.fasta > output1.fasta
sed: file scaffold_mapping1.txt line 1: unknown command: `>'
UNIX SED 重命名 BioInformatics Fasta

评论

0赞 shellter 10/31/2023
如上所述,来自 Ed。请更新您的问题并删除您的评论,然后我们都可以删除我们的评论并节省其他读者的时间。请注意,cmd 文件应该看起来更像是多行,(我不确定您的输出需要什么,所以我无法为您提供确切的帮助。要回答你的字符问题,你可以做 .当它工作没有错误时,您可以添加并且只有一个文件。也许你可以从源头上解决问题?祝你好运。s/scaffold_1_c1/scaffold_1_c1_cov61.3780_length417825/>sed 's/^> //' file > newFile&& mv newFile file>
2赞 Ed Morton 10/31/2023
我投票关闭这个问题,因为 OP 在另一个网站上找到了答案。
0赞 stevesliva 10/31/2023
...它使用新旧字符串对的 CSV。您可以在其中使用 sed 进行替换,然后通过管道到 sed 以从 stdin 获取脚本。最接近OP试图做的事情。制作脚本,管道到...但 OP 缺少“制作脚本”部分。s///sed -f-sed -f- old > new
0赞 Timur Shtatland 10/31/2023
@Geomicro A你确定这里有一个空白:?Fasta 文件通常在 和 序列 ID 之间没有空格:> scaffold_1_c1>>scaffold_1_c1
0赞 Timur Shtatland 11/1/2023
另请参阅:如果与另一个文件匹配,则替换文件(fasta)中的标头.txt

答:

1赞 Ed Morton 10/31/2023 #1

这并不是说“'>'使事情复杂化”,你只是告诉 sed 解释一个不包含 sed 脚本的文件。

这个问题尚不清楚,但我能说这是 OP 想要的,使用任何 POSIX awk:

awk -F'[> ]+' '
    NR==FNR {
        match($2,/([^_]+_){3}/)
        map[substr($2,1,RLENGTH-1)] = $2
        next
    }
    /^>/ && ($2 in map) {
        $0 = "> " map[$2]
    }
    { print }
' scaffold_mapping.txt the_fasta_file

这将输出已发布的预期输出:

> scaffold_1_c1_cov61.3780_length417825

从发布的示例输入。

评论

0赞 Geomicro 10/31/2023
谢谢你@EdMorton的帮助。我没有正确地表达自己,但我在这里为阅读此线程的任何人找到了解决方案:tejashree1modak.github.io/bioblogs/fasta_rename
0赞 Ed Morton 10/31/2023
这就是输入比你说的更简单的问题的解决方案,所以它正在做与我的答案相同的事情,但不必处理解析你拥有的scaffold_mapping.txt格式。
0赞 Timur Shtatland 10/31/2023 #2

首先创建映射文件。使用任何脚本语言,例如 Perl。然后使用映射文件替换 FASTA 标头:

tail -n +2 scaffold_mapping.txt | perl -lpe 's{>((scaffold_\d+_c\d+).+)}{${2}\t${1}};' > map.tsv

perl -lpe 'BEGIN { %new = map { chomp; split; } `cat map.tsv`; } s{^>(\S+)}{>$new{$1}}; ' assembly.contigs.fasta > out.fasta

内容:out.fasta

>scaffold_1_c1_cov61.3780_length417825
ACTG
>scaffold_1_c1_cov61.3780_length417825
ACTGACTG
>scaffold_4_c1_cov84.2432_length70007
ACTGACTGACTG
231031_1055 m-apd-shtatland test% 

Perl 单行代码使用以下命令行标志: :
告诉 Perl 以内联方式查找代码,而不是在文件中查找代码。
:一次循环一行输入,默认分配给输入。在每次循环迭代后添加。
:在内联执行代码之前,剥离输入行分隔符(默认在 *NIX 上),并在打印时附加它。
-e-p$_print $_-l"\n"

BEGIN { ... }:在运行其余代码之前执行代码,此处是解析 fasta 文件之前。
:啜饮整个映射文件,以哈希形式存储结果。
:使用哈希将 fasta 标头 (= 从旧用法到新用法开头的行。 存储序列 ID,即括号内捕获的任何内容。
%new = map { chomp; split; } `cat map.tsv`;%news{^>(\S+)}{>$new{$1}};>%new$1

另请参阅: