在 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
我进行了很多搜索,但找不到解决我的问题的方法。我有一个看起来像这样的文件:
>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