データをcsvファイル(my_datum_file.csv)にダンプしています。これコンテンツすべてコンマで区切られています。探したいです。最後4番目のパラメータのインスタンス(つまり、MX3、TMX、MSVなどについて印刷されたデータの最後のインスタンス)。 5番目のパラメーターは4番目のパラメーターの「サブクラス」です(つまり、TMXには098と001があります)。 7番目のパラメータが「SVlts」ではなく「状態」であることも重要です。尋ねる:10番目の値(分単位の時間)を時間に変換したいと思います。この値を印刷したいです。
だから私はターミナルで次のように書きました。
$ cat /home/ed/start_up_job/my_datum_file.csv | awk -F, '( $4 == "TMX" ) && ( $5 == "098" ) && ( $7 == "status" ) {print $10/60}' | tail -1`'
最終結果は1022.25時間です。これは素晴らしい結果です。
私はこれを一般的な小さなbashスクリプトに含めました。
#!/bin/bash
machine_ID="$1"
machine_number="$2"
echo "$1 $2 hours is `awk -F, -v MID="$machine_id" -v MNR="$machine_number" '( $4 == MID ) && ( $5 == MNR ) && ( $7 == "status" ) {t=$10} END{print int(t/60)}' /home/ed/start_up_job/my_datum_file.csv`"
したがって、端末でbashスクリプトを呼び出すと、$ ./myscript.txt TMX 098
次のような出力が表示されます。TMX 098 hours is: 0
予想される出力は次のとおりです。TMX 098 hours is: 1022.25
何が問題なのかわかりませんか?
答え1
cat
端末で使用したものを交換してawk -F, -v MID="$machine_ID" -v MNR="$machine_number" '( $4 == MID ) && ( $5 == MNR ) && ( $7 == "status" ) {t=$10} END{print int(t/60)}' /home/ed/start_up_job/my_datum_file.csv
動作しました。
コードについて:
awk -F
フィールド区切り文字を次のように定義します。,
-v
プログラム変数に値を割り当てるMID="$machine_ID"
ここで、asMID
はシェル変数forに新しく与えられた変数名です。awk
$machine_ID
-v MNR="$machine_number"
同様に、asという名前の変数を-v
再割り当てすることをシェル変数と呼びます。awk
MNR
$machine_number
( $4 == MID )
4
番目の引数MID
を含めたものと同じにします。&&
そして( $5 == MNR )
5
番目の引数MNR
を含めたものと同じにします。&&
そして( $7 == "status" )
7
次のパラメータを次のようにしてください。status
{t=$10}
10
番目の値を次に割り当てます。t
END
すべての入力を読み込んだ後に一度実行されるルールです。print int(t/60)
印刷物t/60
(前に$記号はありませんt
。)int
エガーとして/home/ed/start_up_job/my_datum_file.csv
ファイルから〜
デフォルトでは、ファイルでは、このコードは/home/ed/start_up_job/my_datum_file.csv
合計を含む値を探します。その後、コードは[$]番目のパラメータの値を入力し、ingの後にそれをegerとして保存します。MID
MNR
10
t
print
int
/
60