如何使用AWK按计数过滤OTU?

时间:2019-06-10 15:50:20

标签: awk

我正在尝试从fasta文件中过滤所有单例。 这是我的输入文件:

 >OTU1;size=3;
 ATTCCCCGGGGGGG 
 >OTU2;size=1;
 ATCCGGGACTGATC
 >OTU3;size=5;
 GAACTATCGGGTAA
 >OTU4;size=1;
 AATTGGCCATCT

预期输出为:

>OTU1;size=3;
ATTCCCCGGGGGGG 
>OTU3;size=5;
GAACTATCGGGTAA

我尝试过

awk -F'>' '{if($1>=2) {print $0}' input.fasta > ouput.fasta 

,但这将删除每个OTU的所有标头。

有人可以帮我吗?

4 个答案:

答案 0 :(得分:2)

请您尝试以下。

awk -F'[=;]' '/^>/{flag=""} $3>=3{flag=1} flag'   Input_file

答案 1 :(得分:2)

$ awk '/>/{f=/=1;/}!f' file
 >OTU1;size=3;
 ATTCCCCGGGGGGG
 >OTU3;size=5;
 GAACTATCGGGTAA

答案 2 :(得分:1)

awk -v FS='[;=]' 'prev_sz>=2 && !/size/{print prev RS $0}   /size/{prev=$0;prev_sz=$(NF-1)}'

>OTU1;size=3;
 ATTCCCCGGGGGGG
 >OTU3;size=5;
 GAACTATCGGGTAA

将每行的大小存储在prev_sz变量中,将整行存储在prev变量中。现在检查其>= 2,然后打印前一行和当前行。 RS用于打印新行。

答案 3 :(得分:0)

尽管上述所有方法都有效,但它们仅限于输入必须始终看起来相同的事实。即您的fasta文件中的序列名称必须采用以下格式:

>NAME;size=value;

一些解决方案可以处理更多的扩展序列名,但是没有一种解决方案可以处理更通用的情况,即

>NAME;label1=value1;label2=value2;STRING;label3=value3;

打印顺序,其中标签xxx与值vvv匹配

awk '/>{f = /;xxx=vvv;/}f' file.fasta

打印顺序,其中标签xxx的数字值p大于q

awk -v label="xxx" -v limit=q \
    'BEGIN{ere=";" label "="}
     />/{ f=0; match($0,ere);value=0+substr($0,RSTART+length(ere)); f=(value>limit)}
     f' <file>

在上面的ere中,我们尝试匹配一个正则表达式。我们使用它来查找标签xxx上附加值的位置。该子字符串的值后面将带有非数字字符,但是通过在其上加上0,它会转换为数字,并丢失所有非数字值(即3;label4=value4;会转换为3)。我们检查该值是否大于我们的限制,然后根据该结果打印序列。