unix 使用Maptxt文件重命名fasta文件

c9x0cxw0  于 7个月前  发布在  Unix
关注(0)|答案(2)|浏览(68)

编辑解决方案: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当前的名称如下:

> 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: `>'

omtl5h9j

omtl5h9j1#

这并不是说“>"使事情变得复杂”,你只是告诉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


从发布的样本输入。

7qhs6swi

7qhs6swi2#

首先创建一个Map文件。使用任何脚本语言,如Perl。然后使用Map文件替换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一行程序使用以下命令行标志:
-e:告诉Perl在线查找代码,而不是在文件中查找。
-p:一次循环一行输入,默认情况下将其分配给$_。每次循环迭代后添加print $_
-l:在执行代码之前去掉输入行分隔符(默认情况下,*NIX上为"\n"),并在打印时附加它。
BEGIN { ... }:在运行其余代码之前执行代码,在这里,在解析fasta文件之前。
%new = map { chomp; split; }cat map.tsv;:slurp整个Map文件,将结果存储在%new哈希中。
s{^>(\S+)}{>$new{$1}};:使用%new散列将fasta头(=以>开头的行)从旧的用法更改为新的用法。$1存储序列ID,即括号内捕获的任何内容。

参见:

相关问题