确定哪些文件至少有特定数量的行与模式匹配

时间:2019-05-24 08:25:19

标签: regex shell text-processing ls fasta

我正在寻找一种识别具有至少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吗?

3 个答案:

答案 0 :(得分:4)

这应该可以完成工作:

grep -Hc '^>' * 2>/dev/null | awk -F':' '$2 > 3 {print $1}'

工作原理:

  • grep -Hc '>' *计算在所有内容('*')中都带有'>'的行
  • 2>/dev/null禁止显示错误消息,因为grep上的*也与目录匹配并导致错误
  • 对于每个匹配项,grep输出fileName:n,n为找到的匹配项数
  • 然后教导Awk读取每行的第二个字段('$ 2'),如果该字段大于3($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并执行closeprint
    • close ARGV:在当前文件中不再处理任何行
    • print "$ARGV\n":打印刚刚完成处理的文件的名称。 $ARGV是当前文件的名称,直到需要处理下一行时才重置。请参阅perlop's I/O operators section中的“类似Perl的伪代码”。

编辑,实际上,Perl在BioPerl和其他模块中对FASTA具有库支持。参见例如https://metacpan.org/search?q=FASTA