我正在尝试从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的所有标头。
有人可以帮我吗?
答案 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
)。我们检查该值是否大于我们的限制,然后根据该结果打印序列。