質問が少し長いので、チェックインとチェックアウトシステムを簡単にしようとしています。メニューにオプション1を使用してチェックインし、オプション2を使用して1日を終え、家に帰るときにチェックアウトします。私のファイルには以下が含まれます。
Dato: 22-02-2018
Mødt ind: 700
Gået hjem: 1600
Overtid:
Dato: 23-02-2018
Mødt ind: 730
Gået hjem: 1600
Overtid:
このファイルで730と1600の違いを見つける必要があります。数字が800を超える場合は、数字を印刷する必要があります(違いがある場合)。私の問題を理解してください。
答え1
Overtid:
これが記入する内容であれば、次のことができます。
awk 'function overtime(s,e) {
if (s) printf("Overtid: %d\n", (e - s > 800) ? e - s : 0);
}
/^Mødt ind:/ { start = $NF; print }
/^Gået hjem:/ { end = $NF; print }
/^Dato:/ { overtime(start, end); print }
END { overtime(start, end) }' file
これは、データから開始時刻と終了時刻を選択し、Dato:
各行の前のレコードの残業時間を印刷します(データの新しいレコードを表します)。これはEND
終了(ブロック)でも行われます。
overtime()
スクリプトの2つの異なる場所で同じことを行う必要があるため、関数として実行しました。データの最初の行に達したときに偽の出力を取得しないように関数if (s)
に含めます。Overtid: 0
Dato:
コードの文は、print
既存のデータを出力に渡します。
データを出力します。
Dato: 22-02-2018
Mødt ind: 700
Gået hjem: 1600
Overtid: 900
Dato: 23-02-2018
Mødt ind: 730
Gået hjem: 1600
Overtid: 870