【问题标题】:Counting number of occurrences in several files计算几个文件中出现的次数
【发布时间】:2017-02-07 06:37:07
【问题描述】:

我想检查在具有相同扩展名的目录的所有文件中递归地出现字符“[”的次数,例如*。C。我正在使用 Unix 中的 SO Solaris。

我尝试了其他帖子中给出的一些解决方案,唯一有效的是这个,因为在这个操作系统上我不能使用命令grep -o

sed 's/[^x]//g' filename | tr -d '012' | wc -c

x 是我要计算的出现次数。这个可行,但它不是递归的,有没有办法让它递归?

【问题讨论】:

  • 您可以通过将filename 替换为*(用于当前目录)或/dir/* 用于另一个目录甚至/dir1/*.txt /dir2/*.txt 来扫描两个目录,从而使其对特定目录进行递归。如果你想递归搜索所有目录,那么使用find 是正确的方法。
  • 谢谢乔治,你是完全正确的,我想要后一种选择,所以我使用了格里沙建议我做的 find 并工作了,谢谢!

标签: shell unix solaris


【解决方案1】:

您可以从find 获取递归列表并使用其-exec 参数执行命令。

我建议:

find . -name '*.c' -exec cat {} \; | tr -c -d ']' | wc -c

tr-c 参数意味着使用与提供的字符串相反的字符串——即在这种情况下,匹配所有内容]

find 命令中的. 表示在当前目录中搜索,但您也可以在其中提供任何其他目录名称。

【讨论】:

    【解决方案2】:

    我希望你已经安装了 nawk。然后你可以:

    nawk '{a+=gsub(/\]/,"x")}END{print a}' /path/*
    

    【讨论】:

    • nawk 不能很好地与我的操作系统配合使用,但还是感谢您的回复!
    【解决方案3】:

    您可以自己编写一个 sn-p 代码。我建议您运行以下命令:

    awk '{for (i=1;i<=NF;i++) if ($i=="[") n++} END{print n}' *.c
    

    这将在当前目录的所有文件中搜索“[”并打印出现次数。

    【讨论】:

    • 我试过这个解决方案,但它似乎打印了发生这种情况的文件数,我想知道该字符在所有文件中出现了多少次。
    • 你确定吗?因为我使用了相同的代码,它向我展示了...10,即使该目录仅包含 5 个文件。
    • 是的,我将该代码用于一个出现 6 次字符 ']' 的文件,它显示了 1。然后我创建了另一个具有相同出现次数的文件并显示了 2,所以我的结论是只统计了角色至少出现一次的文件,但不知道为什么我们有不同的解决方案可能是我做错了,谢谢你的回复!
    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多