【发布时间】:2021-07-08 12:15:52
【问题描述】:
我有一个制表符分隔文件,其中包含第 2、3、12 和 13 列作为日期。 我想确保这些日期是否采用这种格式 - mm/dd/yyyy,如果它们不是这种格式,我想停止该过程并以 1 退出。我能够找到一种方法来做到这一点但首先我必须将列中的每个日期传递给一个函数,而不是这样做,我宁愿使用 awk 命令。
同样,文件中的其他列是字符数据类型,它们的最大长度需要为 40。所以,我必须检查它们是否超过该长度,然后进程也应该停止。
任何帮助将不胜感激。
【问题讨论】:
-
I see你加入这个论坛已经一年半了,之前已经问过5个问题,所以你现在应该已经知道了,但是-请edit你的问题提供minimal reproducible example 具有简明、可测试的样本输入和预期输出,并展示您自己解决问题的尝试,以便我们为您提供帮助。如果不清楚,请参阅How to Ask。
-
我会使用具有适当日期日期类型的语言来进行验证。 Shell 或 awk 可以验证您的字符串是否具有适当的数字位数和
/s,以正确的顺序,但它变得更狡猾。13/0/2021是有效日期吗?03/30/2021是但02/30/2021不是,等等。 -
@chepner 好点。 GNU awk 有
mktime()但它会尝试找出你的意思而不是丢弃无效的日期,例如给定mktime("2021 02 30 0 0 0"),它会将该无效日期视为您编写mktime("2021 03 02 0 0 0"),因此验证日期的方法是执行date="2021 02 30"; secs=mktime(date" 0 0 0"); if ( date == strftime("%F",secs) ) it was valid; else it wasnt,即先将日期转换为纪元秒,然后将纪元秒转换为日期,如果结果日期等于原始日期,则它是有效日期。 -
03/30/2021真的是一个有效的日期吗?也许30/03/2021是有效的,而03/30/2021不是。本地化是一个非常重要的问题!