Мои текущие сценарии GAWK берут файл фраз и создают массив шаблонов регулярных выражений, затем разбивают каждую строку на символ \t и зацикливают первые 10 столбцов каждой строки, затем он проверяет, содержит ли он хотя бы одну фразу из массива шаблонов, если это так, он пропускает строку и не печатает ее в документе.
Проблема:
Поскольку файл фраз большой, он создает множество итераций и делает скрипт очень медленным.
(700 шаблонов x 10 столбцов (разделенных табуляцией \t)) x 1000 строк.
Решение:
Чтобы повысить скорость, я хотел бы объединить первые 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"