我有一个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;文件(可能不是),它们为什么会出现以及如何摆脱它们?如何在我的文件夹中存在比实际出现的文件更多的文件?
答案 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