gpt4 book ai didi

bash - 显示文件和目录中每个单词出现频率的 Shell 脚本

转载 作者:行者123 更新时间:2023-11-29 09:05:26 24 4
gpt4 key购买 nike

我在面试中遇到了一个问题

Shell script to show frequency of each word in file and in a directory

A
- A1
- File1.txt
- File2.txt
-A2
- FileA21.txt
-A3
- FileA31.txt
- FileA32.txt
B
-B1
- FileB11.txt
- FileB12.txt
- FileB13.txt
-B2
-FileB21.txt

我相信我通过理解目录 A 和 B 是两个独立的目录来理解这个问题,A1、A2 和 A3 是 A 的子目录,B1 和 B2 是 B 的子目录。所以我这样回答.

Find . ‘\(-name “A” –and –name “B”\)’ –type f –exec cat ‘{}’ \; | awk ‘{c[$1]++} END {for (i in c) print i, c[i]}’

但我仍然收到反馈说上面的脚本不够好。给定的脚本有什么问题?

最佳答案

主要限制是脚本假定每行只有一个单词。 c[$1]++ 只是增加每行第一个字段的出现次数。

这个问题没有提到一行中的单词数,所以我认为这不是本意 - 您需要遍历一行中的每个单词。另外,空行呢?对于空行,$1 将是空字符串,因此您的脚本最终将计算“空”字(它很乐意将其显示为输出的一部分)。

在awk中,一行中的字段数存储在内置变量NF中;因此很容易编写代码来遍历单词并增加相应的计数(并且它具有隐式忽略没有单词的行的良好副作用)。

所以,我会做这样的事情:

find . -type f -exec cat '{}' \; | awk '{ for (i = 1; i <= NF; i++) w[$i]++ } END { for (i in w) printf("%-10s %10d\n", i, w[i]) }'

为了简洁起见,我删除了 find(1) 的参数中的目录名称限制,并使其更通用。

这(可能)是您的解决方案的主要问题,但问题(故意)含糊不清,还有很多事情需要讨论:

  • 是否区分大小写?此解决方案将 Worldworld 视为不同的词。这是需要的吗?
  • 标点符号呢? hellohello! 应该被视为同一个词吗?逗号呢?也就是说,我们是否需要解析并忽略标点符号?
  • 说到哪个 - what'swhat 之类的事情怎么样?我们认为它们是不同的词吗? 它是 vs. 它的?英语很难!
  • 最重要的是(与上述各点相关),究竟是什么定义一个词?我们假设一个单词是一个非空白序列(awk 中的默认值)。这准确吗?
  • 如果输入中没有单词,我们该怎么办?此解决方案不打印任何内容 - 也许我们应该打印一条警告消息?
  • 一行中的单词数是否固定?或者它是任意的? (例如,如果每行只有一个单词,您的解决方案就足够了)

FWIW,永远记住,你在面试中的成功不是二元的是/否。它不像:糟糕,你不能做 X,所以我要拒绝你。或者:糟糕,答案错误,你出局了。比答案更重要的是让你到达那里的过程,以及你是否意识到(a)你所做的假设; (b) 您的解决方案的局限性。上面的问题显示了考虑边缘情况的能力、澄清假设和要求的能力等,这比获得“正确”的脚本重要得多(而且可能没有正确的脚本这样的东西) .

关于bash - 显示文件和目录中每个单词出现频率的 Shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32316106/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com