问题描述
我进行了很多搜索,但找不到解决我问题的方法。我有一个看起来像这样的文件:
>HEADER1
AACTGGTTACGTGGTTCTCT
>HEADER2
GGTTTCTC
>HEADER3
CCAGGTTTCGAGGGGTTACGGGGTA
我想删除GGTT
模式及其之前的所有内容。因此,基本上,某些行中有几种模式,因此我想删除所有模式,包括模式之前或之中的所有内容。
所需的输出应如下所示:
>HEADER1
CTCT
>HEADER2
TCTC
>HEADER3
ACGGGGTA
我尝试建议ways,但无法将其调整为我的数据。
在此先感谢您的帮助。
解决方法
如果您的标头不能包含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单衬管。第一个单线完成了在这种情况和类似情况下必需的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单行代码使用以下命令行标志:-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