在fasta文件中使用AWK之前,请删除模式和所有内容
我搜索了很多,但找不到解决问题的方法。我有一个文件,看起来像:在fasta文件中使用AWK之前,请删除模式和所有内容,awk,sed,bioinformatics,fasta,Awk,Sed,Bioinformatics,Fasta,我搜索了很多,但找不到解决问题的方法。我有一个文件,看起来像: >HEADER1 AACTGGTTACGTGGTTCTCT >HEADER2 GGTTTCTC >HEADER3 CCAGGTTTCGAGGGGTTACGGGGTA 我想删除GGTT模式及其之前的所有内容。基本上,在一些行中有几个这样的模式,所以我想删除所有这些模式,包括模式之前或其中的所有内容 所需的输出应如下所示: >HEADER1 CTCT >HEADER2 TCTC >HEADER3 A
>HEADER1
AACTGGTTACGTGGTTCTCT
>HEADER2
GGTTTCTC
>HEADER3
CCAGGTTTCGAGGGGTTACGGGGTA
我想删除GGTT
模式及其之前的所有内容。基本上,在一些行中有几个这样的模式,所以我想删除所有这些模式,包括模式之前或其中的所有内容
所需的输出应如下所示:
>HEADER1
CTCT
>HEADER2
TCTC
>HEADER3
ACGGGGTA
我尝试了建议,但无法根据我的数据进行调整
提前感谢您的帮助。如果您的标题无法包含
GGTT
,我想最简单的方法是:
$ sed 's/.*GGTT//' file
>HEADER1
CTCT
>HEADE2
TCTC
>HEADER3
ACGGGGTA
如果您的标题可能包含GGTT
,那么awk可能更好:
$ awk '!/^>/ {sub(/.*GGTT/, "")}1' file
>HEADER1
CTCT
>HEADE2
TCTC
>HEADER3
ACGGGGTA
在这两种情况下,*GGTT
都是“贪婪的”,因此无论是否有多个GGTT
实例,它都会在最后一次出现时匹配并删除所有内容
在awk版本中,模式
!/^>/
确保仅在不以
开头的行上进行替换。请注意,一般情况下,问题中显示的fasta格式的序列可能跨越多行(=它们通常被包装为每行80或100个核苷酸)。与此线程中的其他一些答案不同,此答案也能正确处理此类情况
使用这两个由管道连接的Perl one衬里。第一个一行程序对fasta序列进行所有常见的重新格式化,这在本例和类似情况下是必要的。它删除序列中的换行符和空格(这也会打开序列),但不会更改序列头行。它还可以正确处理文件中的前导和尾随空格/换行符。第二个一行程序实际上以不区分大小写的方式删除了序列中最后一个GGTT
之前的所有内容
注意:如果GGTT
位于序列的末尾,则输出将是一个标题加上一个空序列。参见下面示例中的seq4这可能会导致下游使用的某些生物信息学工具出现问题。
# Create the input for testing:
cat > in.fa <<EOF
>seq1 with blanks
ACGT GGTT ACGT
>seq2 with newlines
ACGT
GGTT
ACGT
>seq3 without blanks or newlines
ACGTGGTTACGT
>seq4 everything should be deleted, with empty sequence in the output
ACGTGGTTACGTGGTT
>seq5 lowercase
acgtggttacgt
EOF
# Reformat to single-line fasta, then delete subsequences:
perl -ne 'chomp; if ( /^>/ ) { print "\n" if $n; print "$_\n"; $n++; } else { s/\s+//g; print; } END { print "\n"; }' in.fa | \
perl -pe 'next if /^>/; s/.*GGTT//i;' > out.fa
Perl one linera使用以下命令行标志:-e
:告诉Perl在线查找代码,而不是在文件中。-n
:一次循环输入一行,默认情况下将其分配给$。
-p
:一次循环输入一行,默认情况下将其分配给$\uu
。在每次循环迭代后添加print$\uz
chomp
:移除输入行分隔符(\n
在*NIX上)。
if(/^>/)
:测试当前行是否为序列头行。
$n
:此变量在开头未定义(false),在看到第一个序列头后为true,在这种情况下,我们会打印一个额外的换行符。此换行符位于每个序列的末尾,从第一个序列开始。
END{print“\n”}
:在最后一个序列之后打印最后一个换行符。
s/\s+//g;印刷品代码>:如果当前行是顺序行(不是标题行),请删除所有空格并在不使用终端换行符的情况下打印
next if/^>/代码>:跳过标题行。
s/*GGTT//i代码>:将最后一个GGTT
之前的所有内容(*
)全部替换为零(=删除)。/i
修饰符表示不区分大小写的匹配
另请参见:
sed
还支持多种过滤器:sed'/^>/!s/*GGTT/'
。。而且,如果我对fasta文件的基本理解是correct@jas,谢谢你的回答。我还有一个问题,如果你能帮我,那就太好了。为什么我们没有在以下版本中使用sed
:sed的///g'
或sed的///d'
?我读过关于d
或g
的文章,但没有完全了解它们的优点。我也见过这种格式的sedsed's//d'
@Apexs//d
应该是//d
(这意味着删除匹配正则表达式的行,注意这里只提供正则表达式,没有替换字符串)g
标志表示替换所有发生的事件,但在该解决方案中只有一个匹配项,因此不需要g
(尽管它仍将与g
一起工作)。。。见识resources@Sundeep,谢谢你的详细提示。我无法完全理解您关于在我的示例中不需要g
的意思,因为只有一个匹配项,但我在一些行中有几个GGTT
。我知道我在这里遗漏了一些东西:)@Apex,答案中提到:在这两种情况下,.*GGTT都是“贪婪的”,所以不管是否有多个GGTT实例,它都会在最后一次出现时匹配并删除所有内容。
-如果仍然没有清除,请参阅以及“最长匹配获胜”下面一节
>seq1 with blanks
ACGT
>seq2 with newlines
ACGT
>seq3 without blanks or newlines
ACGT
>seq4 everything should be deleted, with empty sequence in the output
>seq5 lowercase
acgt