【问题标题】:Determine which files have at least a particular number of lines matching a pattern确定哪些文件至少有特定数量的与模式匹配的行
【发布时间】:2019-05-24 08:25:18
【问题描述】:

我正在寻找一种方法来识别具有至少 3 个序列的FASTA-files。序列由以> 开头的行标识。

以下是 5 个文件的示例:

文件1

>sp1
ATTTT
>sp3
ATTGG
>sp3
ATTGAGGAGA
>sp4
AGGGGAGGACC
>sp5
AGGGGGG
>sp5
AGGGGGG

文件2

>sp1
ATTTT

文件3

>sp1
ATTTT
>sp3
ATTGG
>sp3
ATTGAGGAGA
>sp4
AGGGGAGGACC
>sp5
AGGGGGG

文件4

>sp1
ATTTT
>sp3
ATTGG

文件5

>sp1
ATTTT
>sp3
ATTGG
>sp3
ATTGAGGAGA
>sp4
AGGGGAGGACC
>sp5
AGGGGGG

我想要输出:

file1
file3
file5 

因为这些是具有至少三个序列的文件。我可以用ls 做到这一点吗?

【问题讨论】:

  • ls 命令不能以这种方式查看文件内容并决定是否列出文件条目。这不是设计的目的,它只是根据要求列出目录内容和属性。您需要其他命令来识别计数,然后在条件匹配时打印文件

标签: regex shell text-processing ls fasta


【解决方案1】:

这应该可以完成工作:

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

它是如何工作的:

  • grep -Hc '>' * 计算所有内容中包含“>”的行(“*”)
  • 2>/dev/null 抑制错误消息,因为 grep-ing on * 也匹配目录并导致错误
  • 对于每个匹配,grep 输出 fileName:n,n 是找到的匹配数
  • 然后教 awk 读取每一行的第二个字段 ('$2'),如果它大于 3($2 > 3 部分),则显示文件名,即该行的第一个字段(即$1)
  • -F':' 部分指示 awk 什么是字段分隔符

【讨论】:

  • 哪里是我需要最少 '>' 数量的部分
  • $2 > 3 把3改成最小数。 @chippycentra
  • 您应该使用-H 选项,以便它始终打印文件名,即使只有一个文件。
  • 如果文件名包含冒号,这将失败。
  • 如果以> 开头的行包含另一个>,这将失败
【解决方案2】:

使用 GNU awk:

$ awk '(FNR==1){c=3}/^>/{c--}!c{print FILENAME; nextfile}' * 

这不会处理整个文件,但足以确定 fasta 文件是否有 3 个或更多序列:

  • 每次我们输入新文件时,文件记录号FNR 都会重置为 1。如果发生这种情况,我们会将计数器 c 重置为 3。
  • 每当我们看到以> 开头的行时,我们都会递减计数器
  • 如果我们遇到3 序列(由c==0 识别),我们会打印文件名并移至下一个文件。

【讨论】:

    【解决方案3】:

    这是一个 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

    【讨论】:

      猜你喜欢
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      相关资源
      最近更新 更多