在 fasta 文件中使用 AWK 之前删除模式和所有内容

Remove pattern and everything before using AWK in fasta file

我进行了很多搜索,但找不到解决我的问题的方法。我有一个看起来像这样的文件:

>HEADER1
AACTGGTTACGTGGTTCTCT
>HEADER2
GGTTTCTC
>HEADER3
CCAGGTTTCGAGGGGTTACGGGGTA

我想删除 GGTT 模式及其之前的所有内容。所以基本上在某些行中有几个这样的模式,所以我想删除所有这些模式,包括模式之前或其中的所有内容。

所需的输出应如下所示:

>HEADER1
CTCT
>HEADER2
TCTC
>HEADER3
ACGGGGTA

我尝试了建议 ways 但无法根据我的数据进行调整。

预先感谢您的帮助。

如果您的 headers 无法包含 GGTT,我想最简单的方法是:

$ sed 's/.*GGTT//' file
>HEADER1
CTCT
>HEADE2
TCTC
>HEADER3
ACGGGGTA

如果您的 headers 可能包含 GGTT,那么 awk 可能会更好:

$ awk '!/^>/ {sub(/.*GGTT/, "")}1' file
>HEADER1
CTCT
>HEADE2
TCTC
>HEADER3
ACGGGGTA

在这两种情况下,.*GGTT 都是“贪心”的,所以如果 GGTT 有多个实例并不重要,它将始终匹配并删除最后一个中的所有内容发生。

在 awk 版本中,模式 !/^>/ 确保仅在不以 >.

开头的行上进行替换

请注意,一般来说,问题中显示的 fasta 格式的序列可能跨越多行(=它们通常每行包含 80 或 100 个核苷酸)。与此线程中的其他一些答案不同,此答案也能正确处理此类情况。

使用这两个Perl one-liners通过管道连接。第一个 one-liner 对 fasta 序列进行所有常见的重新格式化,这在这种情况和类似情况下是必需的。它会删除序列中的换行符和空格(这也会打开序列),但不会更改序列 header 行。它还可以正确处理文件中的前导和尾随 whitespace/newlines。第二个 one-liner 实际上以 case-insensitive 的方式删除了序列中直到并包括最后一个 GGTT 的所有内容。

注意:如果GGTT在序列的末尾,输出将是一个header加上一个空序列。见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

文件中的输出 out.fa:

>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

Perl one-linera 使用这些命令行标志:
-e :告诉 Perl 查找代码 in-line,而不是在文件中。
-n :一次循环输入一行,默认分配给 $_
-p :一次循环输入一行,默认将其分配给 $_ 。在每次循环迭代后添加 print $_

chomp : 删除输入行分隔符(\n on *NIX)。
if ( /^>/ ) : 测试当前行是否为序列header行。
$n :这个变量在开始时是未定义的(false),在看到第一个序列 header 后为 true,在这种情况下我们打印一个额外的换行符。此换行符位于每个序列的末尾,从第一个序列开始。
END { print "\n"; } : 在最后一个序列之后打印最后一个换行符。
s/\s+//g; print; :如果当前行是序列(不是 header),则删除所有空格并在没有终端换行符的情况下打印。

next if /^>/; :跳过 header 行。 s/.*GGTT//i; :将所有内容 (.*) 替换为不包含最后一个 GGTT 的所有内容(= 删除它)。 /i 修饰符表示 case-insensitive 匹配。

另请参见:
perldoc perlrun: how to execute the Perl interpreter: command line switches
perldoc perlre: Perl regular expressions (regexes)
perldoc perlre: Perl regular expressions (regexes): Quantifiers; Character Classes and other Special Escapes; Assertions; Capture groups

Remove line breaks in a FASTA file