2012-06-26 2 views
1
awk 'BEGIN 
    { 
    INPUTFILE ='XXX'; iterator =0; 
    requestIterator =0; 
    storageFlag =T; 
    printFlag =F; 
    currentIteration =F; 
    recordCount =1; 
     while (getline < "'"$INPUTFILE"'") 
     { 
      requestArray[requestIterator]++; 
      requestIterator++; 
     } 
    } 
    if ($1 ~ /RequestId/) 
    { 
      FS = "="; 
      if($2 in requestArray) 
      { 
        storage[iterator] =$0; 
        printFlag =T; 
        next 
      } 
      else 
      { 
        storageFlag =F; 
        next 
      } 
     } 
     else 
     { 
      if((storageFlag =='T' && $0 != "EOE")) 
      { 
       storage[iterator]=$0; iterator++; 
      } 
      else {if(storageFlag == 'F') 
      { 
       next 
      } 
      else 
      { 
       if(printFlag == 'T') 
       { 
        for(details in storage) 
       { 
        print storage[details] >> FILE1; 
        delete storage[details]; 
       } 
       printFlag =F; 
       storageFlag =T; 
       next 
      } 
    }' 

위의 코드에서 일부 구문 오류가 발생합니다. 제발 제발 도와 주실 래요?awk 블록의 구문 분석 오류

AWK {BEGIN INPUTFILE = XXXX] 반복자 = 0; requestIterator = 0, T = storageFlag; printFlag = F; currentIteration = F;도 RecordCount = 1; 동안 (<의 getline "") {requestArray [requestIterator] ++ } {else {storageIl} = {0}}}} else {storageIterator ++;}} if ($ 1 ~/RequestId /) {FS = "requestArray" if (printFlag == T) {if ((storageFlag == T & & $ 0! = EOE) {저장소 (iterator) = $ 0; iterator ++;} else {if (storageFlag == F) (저장소의 세부 정보) {저장소] [세부 정보] >> XXXX; 저장소 삭제 [자세히];} printFlag = F; storageFlag = T; 다음}}}}

awk :^구문 오류

awk :^구문 오류

+0

'F'와'T' 변수를 사용하면 아마도 예상했던 것처럼 작동하지 않을 것입니다. 대신 false의 경우 0을 사용하고, true의 경우 1을 사용하거나 'BEGIN'블록에서 명시 적으로 정의하십시오. 또한''T ''는 따옴표 붙지 않은'T'와 같지 않습니다 (그러나''T'''와''T''는 awk에서 동등합니다). – tripleee

+0

또한'FS' 중간 스크립트의 값을 변경하는 것은 아마도 여러분이 기대하는대로하지 않을 것입니다. 'RequestId' 처리가 끝나면 원래의 값으로 재설정해야합니다. – tripleee

+0

당신은'INPUTFILE'을 정의하지만 그것을 사용하지 않으며 쉘 변수를 대신 같은 이름으로 보간합니다 (이것은 제가 정의하지 않았습니다). 변수를 한 번만 사용하면 왜 변수의 값을 원하니? 단지'getline < "XXX"'을 사용하면 괜찮을 것입니다. – tripleee

답변

1

따옴표가 문제입니다. INPUTFILE ='XXX'의 첫 번째 작은 따옴표는 BEGIN 이전의 작은 따옴표와 일치하는 것으로 구문 분석되며, 그 다음부터는 모든 구문 분석이 중단됩니다.

따옴표를 이스케이프하거나 그냥 "인라인"이 아닌 별도의 파일에 awk 파일을 넣으십시오.

# STARTING POINT - known bad 
awk 'BEGIN { INPUTFILE ='XXX'; iterator =0; ... ' 

은 외부 쌍

awk 'BEGIN { INPUTFILE ="XXX"; iterator =0; ... ' 

아니면 더블 또는 싱글을 필요로하는 경우에 따라 내부의 작은 따옴표를 모두 제거하기 위해 다시 작성해야하며, 사용

awk "BEGIN { INPUTFILE ='XXX'; iterator =0; ... ' 
내부에 외부와 하나 두 배

또는 싱글 따옴표를 이스케이프 처리하여 awk로 가져오고 쉘에서 소비하지 않도록하십시오. 당신이 그것을 쉘을 인라인이 아닌 별도의 파일에 awk 스크립트를 넣을 경우 문제의

awk 'BEGIN { INPUTFILE =\'XXX\'; iterator =0; ... ' 

모든

멀리 이동합니다. 너는 좋아하는 따옴표를 가질 수 있고 아무도 신경 쓰지 않을거야 !!

+0

답장을 보내 주셔서 감사합니다.싱글 대신 이중 따옴표를 붙이거나 심지어 따옴표를 넣을 경우 – User

+0

awk 스크립트는 싱글과 더블을 가지고 있으므로, 사용하지 않는 인용문은 이스케이프하지 않는 한 "잘못된"것입니다. 좀 더 자세한 정보로 내 대답을 편집 할 것입니다 ... – John3136

+0

빠른 눈으로, 스크립트 전체에서 작은 따옴표로 큰 따옴표를 대체 할 수 있습니다. – tripleee