用linux写出来fasta文件中每条序列若含-超过总字长的10%就删除这条序列,将删除的所有序列生成一个fasta文件的命令
时间: 2024-02-17 14:02:28 浏览: 72
可以使用以下命令来实现:
```
awk -v len=0 -v max=0.1 '/^>/ {if (len) {if (gap/len > max) {print name} gap=len=name=""} else {name=$0; gap=0} next} {gap+=gsub("-","",$0); len+=length($0)} END {if (gap/len > max) print name}' input.fasta > deleted.fasta
grep -v -f deleted.fasta input.fasta > output.fasta
```
其中,`input.fasta` 是输入的 FASTA 文件名,`deleted.fasta` 是被删除的序列文件名,`output.fasta` 是输出的 FASTA 文件名。`max` 变量指定了序列中允许的最大 gap 占总长度的比例,这里设置为 0.1,即 10%。如果某个序列的 gap 占总长度的比例超过了这个阈值,则将其删除并输出到文件 `deleted.fasta` 中。最后,使用 `grep` 命令将未被删除的序列输出到 `output.fasta` 文件中。
需要注意的是,这个命令假设每条序列都只有一行,如果序列被分成了多行,则需要进行修改。
相关问题
根据ID用sed命令删除fasta文件的某条序列及后面所有序列
假设fasta文件为`test.fasta`,要删除的序列ID为`seq1`,可以使用以下的sed命令:
```
sed -n '/^>seq1$/,/^>/!p' test.fasta > new.fasta
```
解释一下这个命令:
- `-n`参数表示不输出模式空间的内容,只有在命令中指定输出的时候才输出。
- `/^>seq1$/,/^>/!p`表示匹配从以`>seq1`开始到下一个以`>`开头的行之间的所有行,然后取反,即保留不匹配的所有行。
- `test.fasta`是输入的fasta文件。
- `> new.fasta`表示将输出保存到一个新的fasta文件中。
这个命令会将`test.fasta`中的`seq1`序列及其后面的所有序列删除,并将结果保存到`new.fasta`中。
根据fasta文件的ID用sed命令删除某条序列及后面所有序列
好的,根据您的要求,可以使用以下命令删除fasta文件中的某条序列及其后面的所有序列:
```
sed -n '/^>ID/{p;q;}; p' input.fasta > output.fasta
```
其中,将`ID`替换为您要删除的序列的ID,`input.fasta`为原始fasta文件的文件名,`output.fasta`为处理后的文件的文件名。该命令会在找到目标ID的序列时输出该行并退出,之后所有的序列都将被忽略并删除。
阅读全文