2014-11-05 152 views
1

我有一個awk腳本,我需要驗證大量包含日期的行。Awk日期驗證

我目前正在使用基於正則表達式的解決方案來進行基本驗證(沒有測試閏年或)或調用UNIX日期命令來更準確地驗證它。 date命令運行良好,但在性能方面調用系統命令相當昂貴。

我希望這裏的某個人能夠提出一個既準確又快速的解決方案。

這裏是我的數據的一個例子

20140804024614 
20140803190020 
20140803163320 
20140803083222 
20140803170321 
20140803234044 
20140804011857 
20140803204008 
20140803160026 
20140803140120 

感謝。

+0

你在使用GNU awk嗎?如果是這樣,請https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html – 2014-11-05 16:05:46

+0

請顯示您的嘗試,也許您正在使用對系統調用的過度複雜的調用。 – fedorqui 2014-11-05 16:11:36

+0

您是如何將這種格式與「UNIX日期」配合使用的? – hek2mgl 2014-11-05 16:13:53

回答

2

給出了一大堆對你的輸入文件的假設,這個可能是你所需要的僅僅使用GNU AWK時間功能和gensub()打印有效日期+時間:

awk 'strftime("%Y%m%d%H%M%S",mktime(gensub(/(.{4})(..)(..)(..)(..)/,"\\1 \\2 \\3 \\4 \\5 ",""))) == $0' file 

它只會以來的劃時代日期工作。

如果您需要打印某種「有效/無效」消息的每個日期/時間:

$ cat file 
20140230035900 
20140804024614 
$ 
$ awk '{print (strftime("%Y%m%d%H%M%S",mktime(gensub(/(.{4})(..)(..)(..)(..)/,"\\1 \\2 \\3 \\4 \\5 ",""))) == $0 ? "" : "in") "valid:", $0}' file 
invalid: 20140230035900 
valid: 20140804024614 

上述工程的日期+時間轉換爲秒從新紀元,然後將那些秒到原始格式的日期+時間,如果結果與您開始的結果相同,則原始日期有效。

+0

嗨,這看起來像一個非常有用的解決方案。但是,由於包含2月30日的「20140230035900」這樣的日期被標記爲有效,因此似乎不起作用。 – Soucrit 2014-11-05 18:57:26

+0

僅供參考,輸入文件包含許多列。日期字段實際上分成兩列,其他任何一方都有效。 – Soucrit 2014-11-05 19:10:59

+1

謝謝。編輯後的版本完美運行。我注意到下次會添加錯誤的數據。 – Soucrit 2014-11-05 19:37:50

1

檢查:

checkFormat() 
{ 
dateV="${1}" 

echo "${dateV}"|gawk '{ 
    if (match($0,/^((?:19|20)[0-9][0-9])(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])([01][0-9]|2[0-4])$/,a)) { 
     year=a[1]+0 
     mon=a[3]+0 
     day=a[4]+0 
     hour=a[5]+0 
     } 
    else { 
     print "KO: "$0 
     exit 
    } 

    if (day == 31 && (mon == 4 || mon == 6 || mon == 9 || mon == 11)) 
     print "KO: "$0 # 30 days months 
    else if (day >= 30 && mon == 2) 
     print "KO: "$0 # Febrary never 30 o 31 
    else if (mon == 2 && day == 29 && ! ( year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))) 
     print "KO: "$0 # Febrary 29 leap year 
    else 
     print "Correct date !:" $0 
    }' 

} 


checkFormat 2014080417 
checkFormat 20140803190035 

用法:

$ ./checker.sh 
Correct date !:2014080417 
KO: 20140803190035 

注:MINUTESSECONDS將是你的任務:)

檢查也:http://nixtip.wordpress.com/2011/11/28/an-awk-date-format-validator/