0

我将收到一个文件,其中包含姓名和加入日期。我需要验证文件的日期是否为所需的格式并且它是否有效。

所需日期格式:YYYY-MM-DD-HH.MM.SS.NNNNNN eg: 2021-01-12-14.03.38.012098

边文件中的示例内容

Name|Joined_date

aaa|2019-01-12-14.03.38.012098

bbb|2020-03-12-12.04.38.012088

ccc|2018-01-12-14.03

ddd|2019-13-33-14.03.38.012078

eee|2017-03-11-11.04.38.012088

Desired output

aaa|2019-01-12-14.03.38.012098

bbb|2020-03-12-12.04.38.012088

eee|2017-03-11-11.04.38.012088

第 3 条记录没有 MM.SS.NNNNNN,因此需要忽略该记录.... 第 4 条记录 - MONTH 和 DATE 无效,因此需要忽略。

我试过的代码,但它没有工作

awk -F'|' -v OFS='|' ' $2 = "^[0-9]{4}-[0-9]{2}-[0-9]{2}.[0-9]{2}.[0-9]{2}.[0-9]{2}.[0-9]{6}$" ' filename

你能帮我实现预期的输出吗?

4

3 回答 3

0

运算符=检查文字字符串等价性。要检查正则表达式,请使用运算符~

awk -F'|' -v OFS='|' '$2 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}\.[0-9]{2}\.[0-9]{2}\.[0-9]{2}\.[0-9]{6}$/' filename

还要注意反斜杠以匹配文字点。

可以在 a 中使用正则表达式"string"(如果您通过连接字符串和变量来构造正则表达式,则这是必需的),但对于静态正则表达式,我们通常使用斜杠作为分隔符。

我不会扩展正则表达式来检查有效的月份数和月份中的天数,尽管这当然是可能的。相反,我会拆分成单独的数字并检查它们是否有意义。(使用 GNU Awk,您甚至可以将数字传递给以mktime检查有效日期。)

于 2020-07-19T18:10:55.727 回答
0

使用 GNU awk:

gawk -F '|' '
    BEGIN {
        regex = "^([0-9]{4})-([0-9]{2})-([0-9]{2})-([0-9]{2}).([0-9]{2}).([0-9]{2}).[0-9]+$"
    }
    function valid_date(datetime,      m, datespec) {
        if (match(datetime, regex, m)) {
            datespec = m[1] " " m[2] " " m[3] " " m[4] " " m[5] " " m[6]
            return (mktime(datespec) != -1)
        }
        return 0
    }
    valid_date($2)
' file

现在,这将愉快地接受2020-01-32意味着Feb 1, 2020。如果要严格检查输入日期是否出现在日历和时钟上,还有很多工作要做。

于 2020-07-19T20:16:57.207 回答
0

使用 GNU awk 作为第三个参数来匹配()和时间函数:

$ cat tst.awk
BEGIN { FS="|" }
match($2,/^([0-9]{4}(-[0-9]{2}){3}(\.[0-9]{2}){2})\.[0-9]{6}$/,a) {
    dt = gensub(/[.-]/," ","g",a[1])
    secs = mktime(dt)
    if ( dt == strftime("%Y %m %d %H %M %S",secs) ) {
        print
    }
}

.

$ awk -f tst.awk file
aaa|2019-01-12-14.03.38.012098
bbb|2020-03-12-12.04.38.012088
eee|2017-03-11-11.04.38.012088
于 2020-07-19T21:11:33.620 回答