微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在Fasta文件中使用AWK之前,请删除模式和所有内容

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

>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

Remove line breaks in a FASTA file

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。