我想对来自当前目录及其子目录的所有txt
文件中的单词进行统计。
In [39]: ls
about.txt distutils/ installing/ whatsnew/
bugs.txt extending/ library/ word.txt
c-api/ faq/ license.txt words_frequency.txt
contents.txt glossary.txt reference/
copyright.txt howto/ tutorial/
distributing/ install/ using
我首先尝试了命令:
In [46]: !grep -Eoh '[a-zA-Z]+' *.txt | nl
有一个问题是找不到子目录中的文件:
In [45]: !echo *.txt
about.txt bugs.txt contents.txt copyright.txt glossary.txt license.txt word.txt words_frequency.txt
我将其改进为:
In [48]: ! echo */*.txt | grep "about.txt"
In [49]:
再次出现问题,无法找到一级目录的文件,无法遍历随机长度的文件。
有趣的是,python对这个问题有一个解决方案:
In [50]: files = glob.glob("**/*.txt", recursive=True)
In [54]: files.index('about.txt')
Out[54]: 4
它可以递归遍历dirs以查找所有txt
个文件。
然而,python移动文件并将文本数据更改为grep "pattern" *.txt
如何将通配符设置为贪婪的递归行为。
作为替代方案,find
命令有帮助
find . -regex -E ".*\.txt" -print0 -exec grep -Eoh "{}" "[a-zA-Z]+" | nl \;
如果可能的话,这不像贪婪的通配符那么方便。
无法在Macos上激活globstar
。
$ shopt -s globstar
-bash: shopt: globstar: invalid shell option name
$ bash --version
GNU bash, version 4.4.19(1)-release (x86_64-apple-darwin17.3.0)
答案 0 :(得分:1)
如果我正确理解了这个问题,你可以使用这样的东西:
find -type f -name '*.txt' -exec /bin/grep -hEo '\w+' {} \; \
| sort \
| uniq -c \
| sort -k1,1n