正しい awk 文

正しい awk 文

日付と番号を確認するために、以下のファイルがあります。文書:

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は次のように解析します。

  1. 演算子は-文字列連結よりも優先順位が高いため、まず文字列 "%Y%m%d"から変数を減算してd値を取得します。0
  2. これで変数の値date(空)を取得し、ゼロを文字列 "$10"(いいえ10番目のフィールドの値)
  3. これで文字列が生成されます。"0$10"
  4. その後、その文字列に0を追加すると、結果は0になります。
  5. そして、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"
    }
}

おすすめ記事