我的shell脚本计算的文件数量多于文件夹中的实际数量?

时间:2016-02-16 16:35:46

标签: bash shell unix grep

我有一个shell脚本,它会检查文件夹中的每个文件,查找单词"Author"的单词,计算每个文件中作者出现的次数,并按文件逐行打印出来。该数字以"hotel_$i"作为前缀,其中i在列表顶部为1,然后随着您在列表中向下增加。这是我的剧本:

#!/bin/bash
paste <(printf 'hotel_%d\n' {1..825}) \
<(find . -type f -exec bash -c 'grep -wo "Author" {} | wc -l' \; | sort -nr)

问题是,当文件夹中只有825个文件时,我有828个输出行(建议我的文件夹中有828个文件)。这是我的输出:

hotel_1   2686
...(hotel_2 - hotel_824 output lines)
hotel_825  13
        1
        1
        0

我假设2 1&0和0是&#34;额外&#34;文件(可能不是),它们为什么会出现以及如何摆脱它们?如何在我的文件夹中存在比实际出现的文件更多的文件?

2 个答案:

答案 0 :(得分:1)

只需使用awk,例如使用GNU awk for ENDFILE:

awk '/Author/{c++} ENDFILE{print "hotel_"ARGIND, c+0; c=0}' *

或者如果您的文件实际命名为&#34; hotel _ *&#34;:

awk '/Author/{c++} ENDFILE{print FILENAME, c+0; c=0}' hotel_*

如果那样做没有你想要的,那么编辑你的问题以显示一些简洁,可测试,样本输入和预期输出,这样我们就可以帮助你以正确的方式解决问题。你目前的做法是错误的。

答案 1 :(得分:1)

试试

$ for e in hotel_{1..825}; do echo "$e"; grep -wo "Author" "$e" | wc -l; done

未经测试......

如果你想按照匹配的数量排序那么:

$ for e in hotel_{1..825}; do printf "$e "; printf "%d\n" $(grep -wo "Author" "$e" | wc -l); done | sort -nr -k 2