2012-04-10 69 views
1

我有strftime格式的時間,比如說(%Y-%m-%d %H:%M:%S)和一個應該包含這類數據的文件,例如(2012-02-11 17:15:00)。我需要檢查給定模式是否與數據匹配。 如何解決這個問題? awk,約會?檢查給定的strftime格式是否與日期匹配

編輯: 更多信息:用戶輸入strftime格式,讓我們說輸入。然後他輸入一個應該包含這些日期的文件。我需要確保這些數據是有效的(他沒有犯錯)。所以我需要檢查輸入文件中的行並查看是否有與給定模式匹配的數據。例如:

  • 用戶輸入的strftime格式:(%Y-%m-%d %H:%M:%S)

    輸入文件:(2012-02-11 17:15:00) long sentence

    VALID

  • 用戶輸入的strftime格式:Date[%Y.%m.%d %H:%M:%S]

    輸入文件:Date-2012.02.11 17:15:00- long sentence

    無效

+0

我不明白, (2012-02-11 17:15:00)「| gawk'{if(NR == 1)print strftime(」(% Y-%m-%d%H:%M:%S)「),$ 0}' – yazu 2012-04-10 08:45:57

+0

我已經刪除了我的解決方法,因爲我意識到這是無稽之談。我只需要檢查它是否匹配。 thx – tsusanka 2012-04-10 08:59:21

+0

可能重複的[awk - 檢查時間碼](http://stackoverflow.com/questions/10050351/awk-checking-timecode) – 2012-04-11 15:28:29

回答

0

如果您想檢查當前日期時間:

echo "(2012-02-11 17:15:00)" | grep "$(date "+%Y-%m-%d %H:%M:%S")" 

如果其他一些你需要GNU日期(-d選項)。這個工作對我來說:

echo "(2012-02-11 17:15:00)" | 
grep "$(date -d "2012-02-11 17:15:00" "+%Y-%m-%d %H:%M:%S")" 
+0

這隻檢查裏面的數據,但我也需要檢查括號。例如,這將驗證'x2012-02-11 17:15:00)'太......不幸的是(讓我們用「x」切換括號)'echo「x2012-02-11 17:15:00x」| | grep「$(date -d」x2012-02-11 17:15:00x「」+ x%Y-%m-%d%H:%M:%Sx「)」'不起作用 – tsusanka 2012-04-10 09:18:34

+0

我想修改我的問題以獲得更好的理解,但我只是不知道如何......你知道我想完成什麼嗎? – tsusanka 2012-04-10 09:20:38

+0

那麼,只需在日期說明符中添加括號:'grep「$(date -d」2012-02-11 17:15:00「」+(%Y-%m-%d%H:%M:%S) 「)」'如果您需要其他答案,我認爲輸入示例可以提供幫助。 – yazu 2012-04-10 09:25:06

1

如果允許使用外部輔助二進制,我寫dateutils到批量處理日期和時間數據。

dconv -q -i '(%Y-%m-%d %H:%M:%S)' <<EOF 
not a match: 2012-04-10 12:00:00 
a match: (2012-04-10 13:00:00) 
EOF 

會給

2012-04-10T13:00:00 

-i是輸入格式,-q抑制警告。而dconv會嘗試把輸入線,輸出線(在這種情況下,將其轉換匹配行至ISO標準格式。

所以用這個,一個文件匹配完全如果輸入線的數量等於輸出線的數量。

+0

不幸的是,我可能不這樣做,因爲這是一項家庭作業,我應該只使用「標準」unix程序。這正是我想要做的。這不能用awk完成嗎? Thx回答。 – tsusanka 2012-04-10 09:37:15

+0

問題在於awk沒有'strptime()'函數,不幸的是perl(不考慮CPAN擴展) – hroptatyr 2012-04-10 09:40:58

+0

hm,做了很多研究,我什麼都找不到。所以你真的認爲沒有C就不能解決這個問題嗎? – tsusanka 2012-04-10 11:05:21

0

我會採取蠻力方法是:用相應的正則表達式替換任何%X符,那麼你就可以過濾掉不生成的生成正則表達式匹配線:

user_format="%Y-%m-%d" 
awk -v fmt_string="$user_format" ' 
    BEGIN { 
    gsub(/[][(){}?|*+.]/ "\\&", fmt_string) # protect any regex-special chars 
    gsub(/%Y/, "([0-9]{4})", fmt_string) 
    gsub(/%m/, "(0[1-9]|1[012])", fmt_string) 
    gsub(/%d/, "(0[1-9]|[12][0-9]|3[01])", fmt_string) 
    # and so on 
    } 
    $0 !~ "^" fmt_string {print "line " NR " does not match: " $0} 
' filename 
+0

哦,這很殘忍......看起來好像沒有什麼更好的了 – tsusanka 2012-04-10 11:31:35

相關問題