我有一個包含 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
許多情況下更快。