以递归方式在多个文件中运行 grep 和 wc -l

以递归方式在多个文件中运行 grep 和 wc -l

我有多个 fasta 文件,我想计算以 ">" 开头的行(无引号)。

我通常做的是

grep ">" file.fasta | wc -l

这一次适用于一个文件。我正在尝试使用不同的替代方案寻找命令但似乎没有任何作用。我最后想要的是逐行、文件名并计算以 > 开头的行数。理想情况下它必须是一行

答案1

grep可以用它的标志为你计数-c,所以wc -l不需要。另外,grep如果您提供多个文件,则将其作为输入。

例如,

grep -c '^>' some/dir/*.fa

要递归地执行此操作,请使用grep -Rc '^>' dirname如果您有一个grep知道该-R选项的选项(这将运行全部文件),否则使用find

find dirname -type f \( -name '*.fa' -o -name '*.fasta' \) -exec grep -c '^>' /dev/null {} +

/dev/null上面命令中的额外内容确保grep获取至少两个输入文件,这反过来又确保它将始终显示其处理的文件的名称(它不会对单个输入文件执行此操作)。也可以使用-Hwith grep,尽管这是一种非标准选项。

或者,将原始命令插入一个循环,该循环的路径名来自find

find dirname -type f \( -name '*.fa' -o -name '*.fasta' \) -exec sh -c '
    for pathname do
        printf "Counting in %s...\n" "$pathname"
        grep "^>" "$pathname" | wc -l
    done' sh {} +

由于您的命令本身不报告文件名,因此我添加了一条printf提及它的语句。

有关的:

相关内容