Bash 使用grep-v命令后,可以轻松计算文件夹中文件列表中的单词数

Bash 使用grep-v命令后,可以轻松计算文件夹中文件列表中的单词数,bash,grep,wc,Bash,Grep,Wc,我一直在努力使我编写的脚本越来越简单 有许多方法可以用来获取文件夹中所有文件的字数,甚至是文件夹子目录中所有文件的字数 比如,我会写 wc */* 我可能会得到这样的输出(这是期望的输出): 但如果文件太多,我可能会收到如下错误消息: -bash: /usr/bin/wc: Argument list too long 因此,我可以创建一个变量,一次只创建一个文件夹,如下所示: while read $FOLDER do wc $FOLDER/* >> outfile.

我一直在努力使我编写的脚本越来越简单

有许多方法可以用来获取文件夹中所有文件的字数,甚至是文件夹子目录中所有文件的字数

比如,我会写

wc */* 
我可能会得到这样的输出(这是期望的输出):

但如果文件太多,我可能会收到如下错误消息:

-bash: /usr/bin/wc: Argument list too long
因此,我可以创建一个变量,一次只创建一个文件夹,如下所示:

while read $FOLDER
do
    wc $FOLDER/* >> outfile.txt
done < "$FOLDER_LIST"
grep -v dbsnp */* | wc
但这将有两个错误:

  • 参数列表太长
  • 如果它不是太长,它会一次为所有文件提供wc,而不是每个文件
  • 总之,我希望能够做到这一点:

    grep -v dbsnp */* wc > Outfile.txt
    awk '{print $4,$1} Outfile.txt > Outfile.summary.txt
    
    让它返回输出,如我上面所示

    有没有一个非常简单的方法可以做到这一点?或者我至少在看一个循环?同样,我知道101种方法来实现这一点,就像我们其他人使用4-10行脚本一样,但我希望能够在命令提示符中键入2行单行代码……而且我对shell的了解还不够深入,无法知道哪些方法可以满足我对操作系统的要求

    编辑-

    提出了一种解决办法:

    find -exec grep -v dbsnp {} \; | xargs -n 1 wc
    
    此解决方案将产生以下输出:

    wc: 1|0:53458644:AMBIGUOUS:CCAGGGC|-16&GCCAGGGCCAGGGC|-18&GCCAGGGCC|-19&GGCCAGGGC|-19&GCCAGGGCG|-19,.:48:48,48:4,4:0,17:-48,0,-48:0,0,-17:27:3,24:24: No such file or directory
    wc: 10: No such file or directory
    wc: 53460829: No such file or directory
    wc: .: Is a directory
          0       0       0 .
    wc: AA: No such file or directory
    wc: CT: No such file or directory
    wc: .: Is a directory
          0       0       0 .
    wc: .: Is a directory
          0       0       0 .
    

    据我所知,似乎将每一行都视为一个文件。我仍在审阅其他答案,感谢您的帮助。

    您与
    */*
    的匹配项太多,因此grep收到了一个很长的参数列表。您可以使用
    find
    来规避此问题:

    find -exec grep -v dbsnp {} \; | wc
    
    也许您也想消除可能的遍历错误:

    find -exec grep -v dbsnp {} \; 2> /dev/null | wc
    
    这对我很有用:

    grep -or "[a-zA-Z]*" * | cut -d":" -f2 | sort | uniq -c
    

    您现在看到的是基于perreal答案的MapReduce算法:

    如果希望逐个文件使用
    wc
    ,可以使用
    xargs

    find -exec grep -v dbsnp {} \; | xargs -n 1 wc
    
    xargs
    可以读取标准输入,并使用它生成和执行命令行。因此,它读取输入流的结果,并对每个项目执行
    wc
    -n1
    )。

    您提到“这并不能解决以逐项方式返回wc的问题”

    以下将:

    find -exec wc {} \;
    
    但这不会随您的
    grep
    过滤器
    “grep-v”

    如果您打算按照我对该答案的评论所述进行同样的操作,那么请检查以下内容是否适用于您:

    find -exec bash -c  "echo -n {}; grep -v dbsnp {} | wc " \;
    

    这很有趣。为什么wc会出错,而find不会?我怎么才能开始学习这样的东西,你显然知道,但我不知道?我在wc的手册页上没有看到此信息。此外,这并不能解决以逐项方式返回wc的问题;相反,它只返回总数。@VincentLaufer您需要阅读关于
    ARG\u MAX
    find-exec
    旨在通过聚合成适合
    ARG_MAX
    的集合来解决此问题(请参阅:“任何两个或多个路径名集合的大小都应受到限制,以便实用程序的执行不会导致超过系统的{ARG_MAX}限制。”。您的第二个示例与OP的
    wc*/*
    一样受
    ARG\u MAX
    的影响,因此,如果全局扩展太大,它也不会工作。@Vincent我无法理解使用
    grep-v
    的目的,如果您能详细说明一下,可能是我们将尝试围绕它构建一个解决方案。它们是您使用的方式
    grep-v
    ,它将排除包含
    dbsnp
    的所有行,并计算单词数,或者您只想从单词数中排除dbsnp?我想排除整行,我应该补充一点,我实际上是打算使用wc-l,这是有效的,并且达到了预期效果(所有其他答案实际上都失败了-谢谢!!!)请检查第二次发现
    find -exec bash -c  "echo -n {}; grep -v dbsnp {} | wc " \;