请注意,一般而言,问题中显示的 fasta 格式的序列可能跨越多行(= 它们通常每行包含 80 或 100 个核苷酸)。与此线程中的其他答案不同,此答案也可以正确处理此类情况。
使用这两个通过管道连接的 Perl 单线。第一个单行执行所有常见的 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
在文件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 查找内联代码,而不是在文件中。
-n:循环输入一行一次,默认分配给$_。
-p:循环输入一行,默认分配给$_。在每次循环迭代后添加print $_。
chomp:删除输入行分隔符(*NIX 上的\n)。
if ( /^>/ ):测试当前行是否为序列标题行。
$n:此变量未定义(false) 开头,看到第一个序列头后为 true,在这种情况下,我们打印一个额外的换行符。此换行符位于每个序列的末尾,从第一个序列开始。
END { print "\n"; } :打印最后一个序列之后的最后一个换行符。
s/\s+//g; print; :如果当前行是序列(不是标题),删除所有空格并在没有终端换行符的情况下打印。
next if /^>/; :跳过标题行。
s/.*GGTT//i; :将所有内容(.*)替换为包括最后一个 GGTT 在内的所有内容(= 删除它)。 /i 修饰符表示不区分大小写的匹配。
另请参阅:
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