シェルスクリプトでawk構文エラーを修正するには?

シェルスクリプトでawk構文エラーを修正するには?

特定のファイルのデータの合計を抽出して別のファイルに印刷する2つのコードを持つスクリプトがあります。 2番目のコードは、欠落しているデータポイントの合計を別のファイルに抽出します。最後に、2つの出力ファイルが3番目のファイルに統合されます。 3つのコードはすべて個別に実行されたときに機能します。処理するファイルの量が多いため、1つのスクリプトファイルに自動化したいと思います。 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通訳者は、終了することを決定する前に、2つの別々のエラーを認識します。


スクリプトは次のように単純化できます。

#!/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"

結果を出力ファイルに書き込む前に出力ファイルを切り捨てる(空にするには)、最後にに>>変更します。>

関連情報