Unix:如何计算跨多个文件的每一行的实例

时间:2014-06-17 09:03:11

标签: sorting unix command unique

我将面对数百甚至数千个同名文件,但每个文件都在一个具有不同名称的子文件夹中。为了简单说明我的问题,我将仅使用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

非常感谢: - )

1 个答案:

答案 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对输出进行排序。