使用shell搜索文件

时间:2012-01-19 06:55:59

标签: shell

我想从多个文件中创建单词列表。所有文件都包含关键字,前面有一组单词。例如:

Keywords: engine, motor, car, etc.

我想使用shell脚本列出所有这些单词。

来自评论:

这是一组包含电子邮件的文本文件。每个文件都有一个标题,其中包含如下行:

Keywords: photo, camera, color

我想从这些关键字中构建一些单词。也就是说,最后我希望有一系列的单词。

1 个答案:

答案 0 :(得分:1)

(我真的希望你的意思是基于unix / linux的shell)

如果您编辑帖子以包含预期输入的示例(2个小样本文件将是完美的)以及您需要的“单词包”输出,将来有助于获得合理的答案。此外,您可以在一个问题上使用5个标签,因此将基本操作系统指示为unix / linux / Windows / other?和一种可能的编程语言。请注意,当您将鼠标悬停在标记上时,您会看到有多少关注者。不要在只有少数粉丝的东西上浪费宝贵的标签。 (不是你已经这样做了)。越多的粉丝,你就越有可能找到可以帮助你的人。

那就是说,鉴于您在原始邮件和评论中包含的2个数据集,加上我对“一袋词”的最佳猜测,请我提出以下建议:

cat carFile
other stuff
Keywords: engine, motor, car
other stuff

cat cameraFile
other stuff
Keywords: photo, camera, color
more other stuff
Keywords: road, highway, oinker
final other stuff


awk '{
       if ($0 ~ /Keywords:/) {
         line=$0
         sub(/Keywords: /, "", line)
         array[FILENAME] = array[FILENAME] ? array[FILENAME] ", " line : line
       }
      }
      END {
        for (key in array) {
          printf("%s:\t%s\n", key, array[key])
        }
      }
      ' carFile cameraFile

输出

carFile:        engine, motor, car
cameraFile:     photo, camera, color, road, highway, oinker

请注意,我故意将汽车用语放入cameraFile。我们的想法是处理您作为awk脚本参数包含的任何文件,并将任何带有“Keywords:”的行添加到基于输入文件名的列表中。

另请注意,您可以轻松更改输出,只显示从关键字行检索的值(不显示sourceFile名称),方法是从END语句中的输出处理中删除它,例如

       for (key in array) {
          printf("%s\n",  array[key])
        }

有关awk处理的一些细节

FILENAME是一个自动提供的awk变量,对应于正在处理的当前文件。

array是awk关联数组的用户定义名称。它可能是'a'或'arr'或满足awk变量命名约定的任何名称(与所有C语言派生的var名称规则相同)。

sub(...)是'替换'的awk函数。我已将输入行'$ 0'复制到一个名为line的var,然后删除了关键字:该行的一部分。

awk通过隐式循环处理数据,代码位于初始“{...}”块内。

我们扫描具有if ($0 ~ /Keywords:/)的关键字的行,然后仅处理条件块中的那些行。

只有在读取了所有输入文件后,END { ... }块才会“运行”。在这种情况下,我们通过键上的数组循环,并打印出键值对。因为我们将数据附加到数组值(第5行),所以您可以获得两组关键字,以显示cameraFile。

我希望这会有所帮助。

P.S。欢迎来到StackOverflow(S.O。)。请记住阅读常见问题解答,http://tinyurl.com/2vycnvr,使用灰色三角形http://i.imgur.com/kygEP.png投票选择好的Q / A,并通过勾选复选标记接受最能解决问题的答案(如果有的话) ,http://i.imgur.com/uqJeW.png