我當前的GAWK腳本需要使用短語文件,並創建一個正則表達式模式數組,然後用\ t字符分割每行並循環每行的前10列,然後檢查它是否至少包含一個短語從模式數組中,如果有,則跳過該行並不將其打印到文檔中。GAWK concat變量FOR FOR
問題:
由於短語文件是大它創建迭代負荷,使劇本很慢。
(700個圖案×10列(由製表符分隔))×1000行。
解決方案:
爲了提高速度我想Concat的第一列10,並檢查是否整個字符串中包含的至少一個圖案。我無法弄清楚如何連接FOR循環中的行。
工作例如:
gawk 'BEGIN{
FS=" *\t *";
IGNORECASE=1;
while(getline a < "'$phpath'") PATS["^.*"a".*$"]
}
{
ok=1;
for(i=1;i<=10;i++){
for(p in PATS){
if($i ~ p){
ok=0
}
}
}
}
ok {print}' "$f" > "$newPath$filename"
我嘗試:
gawk 'BEGIN{
FS=" *\t *";
IGNORECASE=1;
while(getline a < "'$phpath'") PATS["^.*"a".*$"]
}
{
phrase="";
space=" ";
ok=1;
for(i=1;i<=10;i++){
phrase = $space $phrase $i
}
for(p in PATS){
if($phrase ~ p){
ok=0
}
}
} ok {print}' "$f" > "$newPath$filename"
感謝您提供非常明確的解釋和建議的解決方案。你的代碼看起來更輕量。在建議的解決方案中循環模式時,我需要休息嗎? –
哎呀,是的。更新。 –
由於getline將返回'-1',所以如果遇到讀取模式文件時出錯,會進入無限循環。您需要'while((getline a 0)',請參閱http://awk.freeshell.org/AllAboutGetline。您可以通過從patternfile中創建一個'|'分隔的字符串而不是填充數組來進行比較而無需循環。 –