我有一个包含 1000 多个指示符的文件,这些指示符来自我使用的 bash
for desig in $(desfile)
do
grep $desig in listfile
done
listfile可以每100万+行,所以速度很重要
问题在于像这样的指示符
PA0EHH
DL/PA0EHH
被PA0EHH
发现两次
我发现 awk 可以更具选择性,但速度慢得令人痛苦。
答案1
grep -xF -f desfile listfile
或者,如果desfile
是命令,
grep -xF -f <(desfile) listfile
或者,
desfile | grep -xF -f /dev/stdin listfile
这里使用的选项是
-x
,需要在一条线的整个长度上进行匹配。这就是您想要用来不匹配行上的子字符串的方法。-F
,使用字符串比较而不是正则表达式匹配。这将加快查询速度,如果您的模式包含正则表达式中的特殊字符(而不希望它们变得特殊),那么这将是必要的。-f filename
,从文件而不是从命令行上的字符串读取模式。这适用于适量的模式。如果你有很多许多模式,您可能会耗尽内存,在这种情况下,您可能需要使用将(或命令的desfile
输出)拆分为几个较小的文件,然后迭代这些文件。无论如何,你都会desfile
split
不是想grep
为每个模式调用一次!
答案2
如果您正在检查您的指示符是否是每行的开头,您可以
grep ^$desig listfile
如果您想将其限制为第一次点击,请添加 switch -m 1
。
如果您需要更细粒度的搜索,请尝试正则表达式:
testval=2
seq 40 | grep -e ^$testval\\b
seq 40 | grep -e \\b$testval\\b
两者完全匹配 2,具体取决于您的用例。并防止 grep 识别例如2/2
echo "2/2 2" | grep -e [^\/]\\b$testval\\b
我的 bash 中只有孤独 2 的颜色。
答案3
由于性能是一个问题,因此考虑使用ripgrep
,它的基准测试比grep
许多情况下更快。