提问人:Geomicro 提问时间:10/31/2023 最后编辑:Timur ShtatlandGeomicro 更新时间:10/31/2023 访问量:64
使用映射 TXT 文件重命名 FASTA 文件
renaming fasta file using a mapping txt file
问:
编辑解决方案: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: `>'
答:
这并不是说“'>'使事情复杂化”,你只是告诉 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
从发布的示例输入。
评论
首先创建映射文件。使用任何脚本语言,例如 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`;
%new
s{^>(\S+)}{>$new{$1}};
>
%new
$1
另请参阅:
评论
s/scaffold_1_c1/scaffold_1_c1_cov61.3780_length417825/
>
sed 's/^> //' file > newFile
&& mv newFile file
>
s///
sed -f-
sed -f- old > new
> scaffold_1_c1
>
>scaffold_1_c1