我尝试使用操作创建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
等等等等。
如何获得
答案 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