【问题标题】:In loop cat file - echo name of file - count在循环中 cat 文件 - 文件的回显名称 - 计数
【发布时间】:2017-05-17 11:54:08
【问题描述】:

我尝试使用我可以执行的操作来制作 oneline 命令: 在文件夹“数据”中有 570 个文件 - 每个文件都有一些文本行 - 文件从 1 调用到 570.txt

我想要 cat 每个文件,按单词 grep 并计算该单词出现的次数。 目前他正在尝试使用 ' for '

for FILES in $(find /home/my/data/ -type f -print -exec cat {} \;) ; do echo $FILES; cat $FILES |grep word ; done |wc -l

但如果我这样做,它们会正确计数,但不会显示计数的文件

我希望它看起来:

----> 1.txt <----
210

---> 2.txt <----
15

等等等等等等。

如何获得

【问题讨论】:

    标签: bash for-loop scripting


    【解决方案1】:
    grep -o word * | uniq -c
    

    几乎是你所需要的。

    grep -o word * 为每个命中提供一行,但仅打印匹配项,在本例中为“word”。每行都以在其中找到的文件名作为前缀。

    uniq -c 可以说每个文件只给出一行,并在其前面加上计数。

    您可以使用 awk 或其他任何方式进一步格式化它,例如:

    grep -o word * | uniq -c | cut -f1 -d':' | awk '{print "File: " $2 " Count: " $1}'
    

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      for file in /path/to/folder/data/* ; do echo "----> $file <----" ; grep -c "word_to_count" /path/to/folder/data/$file ; done
      

      for 循环将遍历文件夹“数据”内的文件。 对于这些文件中的每一个,打印名称并搜索“word_to_count”的出现次数(grep -c 将直接输出匹配行数)。

      请注意,如果您的搜索词在一行中有多次迭代,此解决方案将只计算一次迭代。

      【讨论】:

      • 你应该避免解析ls,尝试for file in /path/to/folder/data/*
      • 谢谢,我改变了你的解决方案
      【解决方案3】:

      一点 awk 应该可以吗?

      awk '{s+=$1} END {print s}' mydatafile
      

      注意:如果您要添加超过 2^31 (2147483647) 的任何内容,某些版本的 awk 会出现一些奇怪的行为。有关更多背景信息,请参见 cmets。一种建议是使用printf 而不是print

      awk '{s+=$1} END {printf "%.0f", s}' mydatafile
      
      
      $ python -c "import sys; print(sum(int(l) for l in sys.stdin))"
      

      如果你只想要总行数,你可以使用

      find /home/my/data/ -type f -exec cat {} + | wc -l
      

      【讨论】:

        猜你喜欢
        • 2014-09-16
        • 1970-01-01
        • 2010-12-21
        • 2016-06-25
        • 1970-01-01
        • 1970-01-01
        • 2013-09-23
        • 2016-08-16
        • 1970-01-01
        相关资源
        最近更新 更多