日付と番号を確認するために、以下のファイルがあります。文書:
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"
}
}
答え2
この部分は私が間違っていて、Glennが正しかった。しかし、とにかくいいえ(date "+%Y%m%d" -d "$10")+0
awkで変数date
とが設定されていない場合、数値が0の2つの文字列とフィールド10(値)を減算すると、d
この場合-20161499の値が生成されることがあります。+%Y%m%d
20161499
date
必要に応じて実行してください。
awkでコマンドを実行して出力を取得するには、パイプ形式を使用します。getline
(システムやオンライン情報を確認してください)しかし、状況に完全に適応することはできないので、これを行動の一部として作成してください。
{ cmd = "date +%Y%m%d -d " $10; cmd | getline checktime; close (cmd);
if( checktime != $10 ) { print "invalid time" $10; next } }
あるいは、GNUがある場合awk
(GNUがある場合はおそらくそうしますdate
)、次のように使用できます。内蔵機能mktime
とstrftime
(通常複雑な状況に本当に適しています)
strftime("%Y%m%d", mktime(substr($10,1,4)" "substr($10,5,2)" "substr($10,7,2)" 00 00 00")) == $10