特定のファイルのデータの合計を抽出して別のファイルに印刷する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"
結果を出力ファイルに書き込む前に出力ファイルを切り捨てる(空にするには)、最後にに>>
変更します。>