我有一个以制表符分隔的文件,它有第2、第3、第12个&第13列为日期。我想确保这些日期是否是这种格式-mm/dd/yyyy,如果不是这种格式,我想停止进程并用1退出。我找到了一种方法来做到这一点,但首先我必须将列中的每个日期传递给一个函数,而不是这样做,我更喜欢使用awk命令。
类似地,文件中的其他列是字符数据类型,它们的最大长度需要为40。所以,我必须检查它们是否超过了这个长度,然后这个过程也应该停止。
如有任何帮助,我们将不胜感激。
正如chepner的评论所指出的,使用一种可以识别日期并验证其是否为有效日期的语言是很重要的。如果你想使用shell脚本,你可以在bash中使用date
:
#!/usr/bin/env bash
while IFS=$'t' read -r -a array; do
for i in 2 3 11 12; do date -d "${array[i-1]}" > /dev/null || exit 1; done
done < "$1"
但是,如果必须处理大文件,这不是很实用,因为它需要对额外的可执行文件进行多次调用。GNU awk具有时间处理功能。正如Ed Morton的评论所表明的那样,验证一个正确的时间有点棘手。函数mktime
额外处理日期:
$ awk 'BEGIN{
print strftime(mktime("2000 01 01 0 0 0"),"%F")
print strftime(mktime("2000 01 32 0 0 0"),"%F")
print strftime(mktime("2000 01 -1 0 0 0"),"%F")
print strftime(mktime("2000 13 01 0 0 0"),"%F")
}'
2000-01-01
2000-02-01
1999-12-30
2001-01-01
因此,为了验证您的日期,您必须检查输入格式是否等于输出格式:
$ awk 'function cvt_time(d) {
return strftime( "%d/%m/%Y", mktime(substr(d,7,4)" "substr(d,4,2)" "substr(d,1,2)" 0 0 0") )
}
BEGIN{FS="t"}
($2 != cvt_time($2) ) { exit 1 }
($3 != cvt_time($3) ) { exit 1 }
($12 != cvt_time($12)) { exit 1 }
($13 != cvt_time($13)) { exit 1 }' file