현재 GAWK 스크립트는 구문 파일을 가져 와서 정규식 패턴의 배열을 만든 다음 각 행을 \ t 문자로 분할하고 각 행의 처음 10 열을 반복 한 다음 하나 이상의 구문을 포함하는지 확인합니다 패턴 배열에서, 그럴 경우 선을 건너 뛰고 문서로 인쇄하지 않습니다.FOR에서의 GAWK concat 변수
문제 : 구문 파일은 반복 하중을 생성 크고 스크립트가 매우 느린하게
때문입니다.
(700 패턴 x 10 열 (탭 \ t로 구분)) x 1000 행.
솔루션 :
내가 처음 10 열을 CONCAT 싶습니다 속도를 향상시키고, 전체 문자열이 적어도 하나의 패턴이 포함되어 있는지 확인합니다. 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"
내 시도 : AWK에서
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'을 반환하기 때문에 patternfile을 읽는 중 오류가 발생하면 무한 루프가됩니다. 'while ((getline a) 0)'이 필요하다. http://awk.freeshell.org/AllAboutGetline을 보라. 배열을 채우는 대신 patternfile에서 분리 된'|'문자열을 만들어서 루프없이 비교할 수 있습니다. –