我想从多个文件中创建单词列表。所有文件都包含关键字,前面有一组单词。例如:
Keywords: engine, motor, car, etc.
我想使用shell脚本列出所有这些单词。
来自评论:
这是一组包含电子邮件的文本文件。每个文件都有一个标题,其中包含如下行:
Keywords: photo, camera, color
我想从这些关键字中构建一些单词。也就是说,最后我希望有一系列的单词。
答案 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