2012-04-12 7 views
5

출력 파일에서 입력 파일의 형식을 지정하는 경우 awk을 사용하고 있습니다. 변수를 채울 패턴이 여러 개 있습니다 (예 : "some pattern"). 이 변수는 END 블록에 필수 형식으로 인쇄됩니다. 입력 파일의 모양 순서는 보장되지 않지만 출력 파일의 순서는 항상 동일해야하기 때문에 출력을 완료해야합니다.awk : END 블록에서 'exit'catch

BEGIN { 
    FS = "=|," 
} 


/some pattern/ { 
    if ($1 == 8) { 
     var = $1 
    } else { 
     # Incorrect field value 
     exit 1 
    } 
} 

END { 
    # Output the variables 
    print var 
} 

내 문제는 패턴에 exit 문입니다. 오류가 있고이 명령을 호출하면 출력이 없거나 오류 메시지가 많아야합니다. 그러나 gawk 매뉴얼 (here)에 따르면, exit 명령이 패턴 블록에서 호출되면 END 블록이 최소한 실행됩니다.

if (!exit_invoked) { 
    print var 
} 

또는 END 블록에 출력을 인쇄 피하기 위해 다른 방법 : 같은 exit를 잡을 수있는 방법이 있습니까?

스테판

편집 :는 shellter의 솔루션을 사용합니다.

답변

6

당신이 exit 라인 이전 exit_invoked을 설정하여, 명시 적으로 처리해야합니다, 즉

BEGIN { 
    FS = "=|," 
} 


/some pattern/ { 
    if ($1 == 8) { 
     var = $1 
    } else { 
     # Incorrect field value 
     exit_invoked=1 
     exit 1 
    } 
} 

END { 
    if (! exit_invoked ) { 
     # Output the variables 
     print var 
    } 
} 

도움이 되었기를 바랍니다.

+0

감사합니다.이 간단한 해결책에 대해 생각하지 마십시오.) 나는 이것을 'exit_invoked' 세트를 잊지 않는 함수로 묶을 것입니다. Stefan – Stefan

+1

@ 스탄 : 좋은 생각. 재생중인 변수가 있음을 상기시켜주기 위해 BEGIN 블록에 'exit_invoked = 0'을 설정하는 것이 좋습니다. 어떤 사람들은 불필요하고 불필요하다고 불평 할 것입니다. 나는 그것을 스스로하지는 않겠지 만, 좋은 자기 기록 기술자이다. YRMV. 행운을 빕니다. – shellter

+0

필자가 직접 awk 프로그래밍을 작성하지 않기 때문에이 작업을 수행 할 것입니다. 감사. – Stefan

-2
END { 
     # If here from a main block exit error, it is unlikely to be at EOF 
     if (getline) exit 
     # If the input can still be read, exit with the previously set status rather than run the rest of the END block. 

     ......