日付と番号を確認するために、以下のファイルがあります。文書:
006063416.01|USD|1| |00.00000|00.00000|O| |20100802|20160119| |D|+0000006063416|0000000000| |060.634164000|
06063416.001|AUD|M| |00.00000|00.00000|O| |2015991130|20160319| |D|+0000006063416|0000000000| |006a063416096|
06063416.002|HKD|M| |00.00000|00.00000|O| |20151130|20168919| |D|+0000006063416|0000000000| |006063416075|
スクリプト:
#!/bin/ksh
set -x
validate() {
echo "Performing file validations ..."
file=/var/applications/scripts/bin/CLIMAMT_SG
CURR_DTTM=`date +%Y%m%d.%H%M%S`
output=/var/applications/scripts/bin/output_CLIMAMT_SG.${CURR_DTTM}
awk -F\| '$16 !~ /^[0-9]+$/ {print "Line:"NR" Field:16 "$16" is not Numeric"}(date "+%Y%m%d" -d "$10")+0 != "$10"{print "Line:"NR" Field:10 "$10" is not in date format";next}' $file > $output
echo "Validation Complete"}
validate
出力:
Line:1 Field:16 060.634164000 is not Numeric
Line:1 Field:10 20160119 is not in date format
Line:2 Field:16 006a063416096 is not Numeric
Line:2 Field:10 20160319 is not in date format
Line:3 Field:10 20168919 is not in date format
質問20160319も間違っていると報告されています。
ベストアンサー1
この行は:
(date "+%Y%m%d" -d "$10")+0 != "$10"{print "Line:"NR" Field:10 "$10" is not in date format";next}
するいいえ外部コマンドを呼び出しますdate
。 awkは次のように解析します。
- 演算子は
-
文字列連結よりも優先順位が高いため、まず文字列 "%Y%m%d"から変数を減算してd
値を取得します。0
- これで変数の値
date
(空)を取得し、ゼロを文字列 "$10"(いいえ10番目のフィールドの値) - これで文字列が生成されます。
"0$10"
- その後、その文字列に0を追加すると、結果は0になります。
- そして、10番目のフィールドの値と比較してみてください。
0
フィールド 10 にある場合のみ一致します。
GNU awkには、同様の操作を実行できる時間機能があります(テストされていません)
function validate_date(datestr, timespec) {
timespec = substr(datestr,1,4) " " substr(datestr,5,2) " " substr(datestr,7,2) " 0 0 0")
return mktime(timespec)
}
{
if (validate_date($10) == -1) {
print $10 " is an invalid date"
}
}