Awk:如何在文件夹和子文件夹中处理多个.txt文件?

6

给定一个包含多个语言的 .txt 文件的子文件夹的文件夹,例如:

But where is Esope the holly Bastard
But where is 생 지 옥 이 군
지 옥 이
지 옥
지
我 是 你 的 爸 爸 !
爸 爸 ! ! !
你 不 會 的 !

我已经知道如何在一个文件中计算空格分隔的单词频率count space-separated word-frequency within ONE file.txt

$ grep -o '\w*' myfile.txt | awk '{a[$1]++}END{for(k in a)print a[k],k}' | sort > myoutput.txt

获取优雅的:
111 Bastard
1 Esope
1 holly
1 the
111122 But
2 is
2 where
223445

如何更改代码,使其适用于文件夹及其子文件夹中的多个文件,这些文件都呈现相似的模式(至少为*.txt)?
2个回答

4
您可以使用find命令来完成此操作。如下所示:
find -iname '*.txt' -exec cat {} \; | grep -o '\w*' | awk '{a[$1]++}END{for(k in a)print a[k],k}' | sort 

我正在使用选项-exec,在当前目录及其子目录中cat每个*.txt文件。输出将被传送到grep|awk|sort管道中。


好的,它可以工作了。在确认之前,我会等待一些不同的提议。注意: find 命令也会搜索隐藏文件。我的工作目录是一个 USB,我还在查找之前删除的文件,导致结果超出预期两倍(有趣)。 - Hugolpz
3
要排除隐藏文件(以点“.”开头的文件)可以调整查找模式,如下所示:-iname '[^\.].*.txt' - hek2mgl

1
为什么使用 find
使用 glob 应该已经足够了。
awk '{a[$1]++}END{for(k in a)print a[k],k}' *.txt | sort > out.txt 

为了支持递归目录结构,您需要启用globstar选项并使用**

shopt -s nullglob
awk '{a[$1]++}END{for(k in a)print a[k],k}' *.txt | sort > out.txt 

微调

您需要了解如何使用awk来执行类似于grep -o \w*的操作,例如(/[[:alpha:]]+/部分):

awk '/[[:alpha:]]+/{print $0}' *.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接