2016-08-09 5 views
0
NR>NRMIN{ 
    if($3 == "Leu") { 
     if($4 == "CD1" || $4 == "HD11" || $4 == "HD12" || $4 == "HD13") { 
      next; 
     } 
    } 
    elseif($3 == "Val") { 
     if($4 == "CD1" || $4 == "HD11" || $4 == "HD12" || $4 == "HD13") { 
      next; 
     } 
    } 
    else { 
     print; 
    } 
} 

필자는 공백으로 구분 된 파일의 줄을 선택적으로 인쇄하려고합니다. gawk -f FILE_Modifier.awk NRMIN = 90 FILE > NEWFILEAwk If-Elseif-If 블록

오류 메시지

gawk: FILE_Modifier.awk:7:  elseif($3 == "Val") { 
gawk: FILE_Modifier.awk:7:      ^syntax error 
gawk: FILE_Modifier.awk:12:  else { 
gawk: FILE_Modifier.awk:12: ^syntax error 
+1

'오류가 발생했습니다'라고 말하지 않고 질문에 오류 메시지를 포함시킨 경우 매우 유용합니다. ** 정말로 변수 할당'NRMIN = 90'의 중간에 공백을 두었습니까? ** else와'if '사이에 공백을 두지 않았습니까? –

+1

두 단어를 사용하십시오 : else if. awk는'elif' 나'elsif' 나 그 변형을 지원하지 않습니다. 'if ($ 3 == "Leu")'에 대한 블록은 아무 것도 출력하지 않으며, 일단 구문을 수정하면'else if ($ 3 == "Val") 블록과 비슷하게 인쇄됩니다. MCVE ([MCVE])로 작업 중이거나 SOFTWARE를 감독하는 코드 일 가능성이 있으므로 코드를 최소화했기 때문일 수 있습니다. –

+0

@EdMorton 문제가 해결되었습니다. 감사. – Frequency

답변

1

elseif이없는 경우 위의 코드가 오류를주는 이유를 알려 주시기 바랍니다. 어쨌든 다음과 같이 스크립트를 다시 작성할 수 있습니다.

awk -v nrmin=90 '(NR > nrmin) && !(($3 ~ /^(Leu|Val)$/) && ($4 ~ /^(CD1|HD11|HD12|HD13)$/))' file 

내장 이름과의 충돌을 피하기 위해 모든 대문자 변수 이름을 사용하지 마십시오. 특정 이유가없는 한 변수를 앞에 설정하십시오 (-v).