在 shell 脚本中优化 grep(或使用 AWK)
在我的 shell 脚本中,我尝试使用 $sourcefile 中找到的术语一遍又一遍地针对同一 $targetfile 进行搜索。
我的 $sourcefile 的格式如下:
pattern1
pattern2
etc...
我必须搜索的低效循环是:
for line in $(< $sourcefile);do
fgrep $line $targetfile | fgrep "RID" >> $outputfile
done
我知道可以通过将整个 $targetfile 加载到内存中或使用 AWK 来改进这一点?
谢谢
In my shell script, I am trying to search using terms found in a $sourcefile against the same $targetfile over and over.
My $sourcefile is formatted as such:
pattern1
pattern2
etc...
The inefficient loop I have to search with is:
for line in $(< $sourcefile);do
fgrep $line $targetfile | fgrep "RID" >> $outputfile
done
I understand it would be possible to improve this by either loading the whole $targetfile into memory, or perhaps by using AWK?
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我是否遗漏了什么,或者为什么不只是
fgrep -f "$sourcefile" "$targetfile"
?Am I missing something, or why not just
fgrep -f "$sourcefile" "$targetfile"
?sed 解决方案:
sed 's/\(.*\)/\/\1\/p/' $sourcefile | sed -nf - $targetfile
这将 $sourcefile 的每一行转换为 sed 模式匹配命令:
到
但是,您需要转义特殊字符才能使其健壮。
A sed solution:
sed 's/\(.*\)/\/\1\/p/' $sourcefile | sed -nf - $targetfile
This transforms every line of $sourcefile to a sed pattern match command:
to
You'd need to escape special characters to make this robust, however.
使用 awk 读取源文件,然后在目标文件中搜索(未经测试):
也将与
gawk
一起使用。Using awk to read in the sourcefile then searching in targetfile (untested):
Will also with with
gawk
.