使用awk求和日期



我正试图使用awk以这种方式将日期相加:

awk 'BEGIN { print date -d $(date -d "20181222" "+%Y%m%d") + 30}'

但我的回报是

030

我在等

20190121

我的约会是一串。

这很有意思地描述了为什么你会得到你得到的结果。

在awk中,一个未加引号的单词(不是函数或命令(是一个变量:

awk 'BEGIN { print date -d $(date -d "20181222" "+%Y%m%d") + 30}'

这里,您有两次"date"变量,两次"d"变量,2个带引号的字符串和一个数字文本。

由于变量"date"one_answers"d"尚未初始化,因此根据上下文的不同,它们被视为空字符串或数字零。因为在"date"one_answers"d"之间使用-,所以将它们放入数字上下文中。

还要注意:

  • awk字符串连接是简单地将两个字符串并排放置:没有显式运算符
  • CCD_ 2符号可以被描述为"字段值去引用"运算符:CCD_ 3右侧的单词是要使用的字段号
  • 在BEGIN块中,awk尚未处理任何记录,因此任何$x都将变为空字符串

awk基本上看到了这一点:

awk 'BEGIN { print date -d $(date -d "20181222" "+%Y%m%d") + 30}'
awk 'BEGIN { print (0 - 0) $((0 - 0) "20181222" "+%Y%m%d") + 30}'  # variable values
awk 'BEGIN { print 0 $(0 "20181222" "+%Y%m%d") + 30}'              # arithmetic
awk 'BEGIN { print 0 $("020181222+%Y%m%d") + 30}'                  # string concat
awk 'BEGIN { print 0 $(20181222) + 30}'                            # field is a number
awk 'BEGIN { print 0 "" + 30}'                                     # field value
awk 'BEGIN { print 0 (0 + 30)}'                                    # numeric context
awk 'BEGIN { print 0 30}'                                          # arithmetic
awk 'BEGIN { print "030"}'                                         # string concat

您可以在GNU awk中本地执行日期运算:请参阅https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html

gawk -v date=20181222 -v days=30 'BEGIN {
datespec = substr(date, 1, 4) " " substr(date, 5, 2) " " (substr(date, 7, 2) + days) " 0 0 0"
time = mktime(datespec)
print strftime("%Y%m%d", time)
}'
20190121

幸运的是,GNU awk的日期时间库将"2018年12月52日"识别为"2019年1月21日">


如果您没有GNU awk并且无法安装它,perl应该足够了:

perl -sE '
use Time::Piece;
use Time::Seconds;
$t = Time::Piece->strptime($date, "%Y%m%d");
$t += $days * ONE_DAY;
say $t->ymd("");          # or, say $t->strftime("%Y%m%d")
' -- -date=20181222 -days=30

我不确定为什么你需要awk来做这个,看起来你有GNUdate,如果是,那么试着遵循一次。

date '+%Y%m%d' -d "20181222+30 days"
20190121

您可以调用awk中的命令

$ awk -v d=30 'BEGIN{cmd="date -d "20181222+" d "days" +"%Y%m%d""; 
cmd | getline date; print "date:" date}'
date:20190121

最新更新