【发布时间】:2016-11-16 06:54:41
【问题描述】:
我当前的 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"
【问题讨论】: