我正试图使用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