在循环cat文件中 - 文件的echo名称 - count

时间:2017-05-17 11:54:09

标签: bash for-loop scripting

我尝试使用操作创建oneline命令: 在文件夹"数据"拥有570个文件 - 每个文件都有一些文本行 - 文件从1到570.txt调用

我想要猫每个文件,用文字grep并计算这个单词出现的manny。 目前他正在尝试使用'为'

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
等等等等。

如何获得

3 个答案:

答案 0 :(得分: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}'

答案 1 :(得分:0)

你可以试试这个:

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

for循环将覆盖文件夹内的文件&#34;数据&#34;。 对于这些文件中的每一个,打印名称并搜索&#34; word_to_count&#34;的出现次数。 (grep -c将直接输出匹配行的计数)。

小心,如果你的搜索词在一行内有多次迭代,这个解决方案只计算一次迭代。

答案 2 :(得分:-1)

awk应该这样做吗?

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

注意:如果您要添加超过2 ^ 31(2147483647)的任何内容,某些版本的awk会有一些奇怪的行为。有关更多背景,请参阅评论一个建议是使用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