【发布时间】:2014-07-29 00:41:44
【问题描述】:
我打算直接说这是一个家庭作业问题,但我觉得我已经用尽了在线搜索与如何解决此问题相关的任何内容,或者我只是没有为 Google/正确措辞堆栈溢出。
问题的开头是这样的:文件 words 包含一个单词列表。每个单词都在单独的行上。文件 story1、story2、...、story100 是短篇小说。
这是一个多部分的问题,但最后一部分难倒我:找出包含文件 words 中所有单词的故事文件。
之前有一个类似的问题:从文件words中找出至少包含一个单词的故事文件(打印文件名)。
这个是我用 grep 解决的:
grep -l -f words story*
我的印象是我还必须使用 grep 来解决最后一个问题,但我似乎找不到 grep 的选项或任何只返回与模式文件中的所有内容匹配的文件的选项.看来我可能必须使用 shell 脚本来执行此操作,但不确定从哪里开始,或者我什至需要 grep 来完成此操作。有关如何解决此问题的任何指示?
谢谢!
编辑:
这些是教师给出的解决方案中的正确答案。
主要问题之前的问题: grep -l -f words story*
主要问题:
for story in `ls story*`
do
(( match = 0 ))
for word in `cat words`
do
if [ `grep -l $word $story` ]
then
(( match++ ))
else
break
fi
done
if [ $match -eq `wc -w < words` ]
then
echo $story
fi
done
感谢大家深思熟虑的意见和回答,很抱歉我迟到了一点。
【问题讨论】:
-
想不出只使用
grep而不使用eval/evil的方法。但是您可以遍历文件并逐行读取每个文件,然后如果发现不存在的行不打印任何内容,否则在循环完成后打印文件名。此外,这只是一个建议,但您可能需要查看大括号扩展{1..#},因为虽然您对另一个问题的解决方案在技术上涵盖了story1..100,但它也可能捕获错误文件。 -
感谢您的提示,BroSlow,我会尝试的!哈哈,我没听懂,也感谢您指出这一点!我很高兴能真正找到解决这个问题的方法,这让我有点不知所措。
-
grep -l -f words story*并没有按照您的想法行事。它告诉 grep 在story*中查找与words中包含的正则表达式匹配的文本。最明显的问题是,如果words包含单词the,其中一个故事文件包含单词then,那么grep 将报告自@987654335 以来在该文件中找到REthe@ 匹配then的开头。您需要使用至少提供单词边界的工具,例如GNU awk。