我正在寻找一种识别具有至少3个序列的FASTA文件的方法。序列由以>
开头的行标识。
以下是5个文件的示例:
file1
>sp1
ATTTT
>sp3
ATTGG
>sp3
ATTGAGGAGA
>sp4
AGGGGAGGACC
>sp5
AGGGGGG
>sp5
AGGGGGG
file2
>sp1
ATTTT
file3
>sp1
ATTTT
>sp3
ATTGG
>sp3
ATTGAGGAGA
>sp4
AGGGGAGGACC
>sp5
AGGGGGG
file4
>sp1
ATTTT
>sp3
ATTGG
file5
>sp1
ATTTT
>sp3
ATTGG
>sp3
ATTGAGGAGA
>sp4
AGGGGAGGACC
>sp5
AGGGGGG
我想要输出:
file1
file3
file5
因为那些是至少具有三个序列的文件。我可以用ls
吗?
答案 0 :(得分:4)
这应该可以完成工作:
grep -Hc '^>' * 2>/dev/null | awk -F':' '$2 > 3 {print $1}'
工作原理:
grep -Hc '>' *
计算在所有内容('*')中都带有'>'的行2>/dev/null
禁止显示错误消息,因为grep
上的*
也与目录匹配并导致错误grep
输出fileName:n
,n为找到的匹配项数$2 > 3
部分),则显示文件名,即文件名的第一个字段。行(即$1
)-F':'
部分指示awk什么是字段分隔符答案 1 :(得分:1)
使用GNU awk:
$ awk '(FNR==1){c=3}/^>/{c--}!c{print FILENAME; nextfile}' *
这将不会处理整个文件,而仅足以确定fasta文件是否具有3个或更多序列:
FNR
都会重置为1。如果发生这种情况,我们会将计数器c
重置为3。>
开头的行时,我们都会递减计数器3
序列(由c==0
识别),我们将打印文件名并移至下一个文件。答案 2 :(得分:0)
这是Perl的一线工具,原因有两个:问题很有趣;这个问题促使我进一步了解Perl!
perl -ne '++$count if /^>/; $count=0, close ARGV, print "$ARGV\n" if $count==3' *
perl -ne
:在处理行时不要打印它们;运行以下代码++$count if /^>/;
-计算以>
开头的行。 $count
开始时未定义,Perl的++
将其视为0
。$count=0 ... close ... print ... if $count==3
:一旦看到第三行以>
开头,请重置$count
并执行close
和print
。
close ARGV
:在当前文件中不再处理任何行print "$ARGV\n"
:打印刚刚完成处理的文件的名称。 $ARGV
是当前文件的名称,直到需要处理下一行时才重置。请参阅perlop
's I/O operators section中的“类似Perl的伪代码”。编辑,实际上,Perl在BioPerl和其他模块中对FASTA具有库支持。参见例如https://metacpan.org/search?q=FASTA。