쉘 스크립트에서 awk 구문 오류를 수정하는 방법은 무엇입니까?

쉘 스크립트에서 awk 구문 오류를 수정하는 방법은 무엇입니까?

주어진 파일에 대한 데이터 합계를 추출하여 다른 파일에 인쇄하는 두 개의 코드가 있는 스크립트가 있습니다. 두 번째 코드는 누락된 데이터 포인트의 합계를 다른 파일로 추출합니다. 마지막으로 두 개의 출력 파일이 세 번째 파일에 통합됩니다. 세 가지 코드는 모두 개별적으로 실행될 때 작동합니다. 처리해야 할 파일의 양이 많기 때문에 하나의 스크립트 파일로 자동화하려고 합니다. bash 쉘을 실행하십시오. Colavg.sh 파일에 실행 권한이 부여되었습니다. 이것을 단일 스크립트로 실행하려고 하면 다음 오류가 발생합니다.

awk: cmd. line:1: ./Colavg.sh
awk: cmd. line:1: ^ syntax error
awk: cmd. line:1: ./Colavg.sh
awk: cmd. line:1:   ^ unterminated regexp
#!/bin/awk

awk -F ',' 'NF==4{count++} END {print "missing: "count}' County029-CO-0023-T0000JD.out > avg.out;
awk -F ',' '$4==-999{c999++}; END{print "missing: "c999}' County029-CO-0023-T0000JD.out > avg1.out;
cat avg1.out avg.out >> County029-CO-0023-T0000JD-avg.out

답변1

문제는 스크립트의 #!-line입니다. 스크립트 #!/bin/sh가 아닌 쉘 스크립트 여야 합니다 awk.

여기서 실제로 일어나는 일은 오류 줄이 있는 쉘이 #!실행된다는 것입니다.

/bin/awk ./Colavg.sh

이는 텍스트 문자열을 프로그램 ./Colavg.sh으로 사용하는 것을 의미합니다 awk. 프로그램 으로서 awk이것은 말이 되지 않습니다. awk통역사는 종료하기로 결정하기 전에 두 가지 별도의 오류를 인식할 것입니다.


스크립트는 다음과 같이 단순화될 수 있습니다.

#!/bin/sh

name=County029-CO-0023-T0000JD

awk -F , '
    $4 == -999 { c999++  }
    NF == 4    { count++ } 
    END { printf "missing: %d\n", c999  }
    END { printf "missing: %d\n", count }' "$name.out" >>"$name-avg.out"

결과를 출력 파일에 쓰기 전에 출력 파일을 자르려면(비우려면) >>끝에 로 변경하십시오.>

관련 정보