我将面对数百甚至数千个同名文件,但每个文件都在一个具有不同名称的子文件夹中。为了简单说明我的问题,我将仅使用3个不同子文件夹的示例:
在subfolder1/logfile.txt
我会有这样的内容:
zebra
house
apple
car
在subfolder2/logfile.txt
我会有这样的内容:
apple
zebra
orange
sun
在subfolder3/logfile.txt
我会有这样的内容:
sun
love
zebra
hat
我想获得一个输出文件,该文件将在所有子目录中的文件名为logfile.txt的文件中计算(总共只有一层深度)每行的出现次数并返回每个唯一行的出现次数
因此,我希望获得此示例的输出结果如下:
3 zebra
2 apple
2 sun
1 car
1 hat
1 house
1 love
1 orange
这可以在一个步骤/命令行中完成吗?
我是否首先需要将所有文件的内容合并为一个然后应用一个命令,以我描述的方式计算唯一行和输出?
或者我需要制作一个Python脚本(我可以这样做,但如果一个简单的命令让我知道为什么要重新发明轮子?)
无论如何,我将如何做到这一点?
非常感谢!
编辑:我有一些额外的要求,希望它可以全部放入一个命令。在返回的输出中,我想将所有子文件夹作为第二列,其中存在该行的发生。我只想知道那些有5次或更少次发生的事情。因此,在示例中,我希望在输出的第一行中输入:
3 subfolder1,subfolder2,subfolder3 zebra
2 subfolder1,subfolder2 apple
依此类推,对于出现次数超过5次的行(本例中没有),我希望在第二列中什么都没有,甚至更好,短语many occurrences
非常感谢: - )
答案 0 :(得分:4)
您可以使用find
,如下所示:
$ find /your/path -name "logfile.txt" -exec cat {} \; | sort | uniq -c | sort -rn
3 zebra
2 sun
2 apple
1 orange
1 love
1 house
1 hat
1 car
这将查找logfile.txt
结构中的所有/your/path
个文件及cat
个文件。然后对输出进行排序并计算每个项目出现的次数。它最终对输出进行排序,以最大限度地发生在顶部。
根据你的扩展要求,你有一个提示:
$ find . -name "logfile.txt" -exec grep -H "" {} \; | awk -F: '{a[$2]++; b[$2]=b[$2] OFS $1} END {for (i in a) print a[i], i, b[i]}' | sort -nr
3 zebra ./t2/logfile.txt ./t1/logfile.txt ./t3/logfile.txt
2 sun ./t2/logfile.txt ./t3/logfile.txt
2 apple ./t2/logfile.txt ./t1/logfile.txt
1 orange ./t2/logfile.txt
1 love ./t3/logfile.txt
1 house ./t1/logfile.txt
1 hat ./t3/logfile.txt
1 car ./t1/logfile.txt
find
获取之前的文件然后grep -H "" {} \;
显示文件的所有行,只有使用-H
的技巧我们得到带有文件名称的输出左边:
$ grep -H "" t2/a
t2/a:apple
t2/a:zebra
t2/a:orange
t2/a:sun
awk
命令存储文本中出现的每个单词的时间以及出现的文件。然后它将结果打印在END
块中。最后,sort -rn
对输出进行排序。