使用awk求和日期
我尝试使用awk以这种方式计算日期中的天数:使用awk求和日期,awk,Awk,我尝试使用awk以这种方式计算日期中的天数: awk 'BEGIN { print date -d $(date -d "20181222" "+%Y%m%d") + 30}' 但是我回来了 030 我期待着 20190121 我拥有的日期是一个字符串。我不确定您为什么需要awk来完成此操作,似乎您拥有GNUdate,如果是,请尝试执行一次 date '+%Y%m%d' -d "20181222+30 days" 20190121 我不知道你为什么需要这个awk,好像你有GNUdate,
awk 'BEGIN { print date -d $(date -d "20181222" "+%Y%m%d") + 30}'
但是我回来了
030
我期待着
20190121
我拥有的日期是一个字符串。我不确定您为什么需要
awk
来完成此操作,似乎您拥有GNUdate
,如果是,请尝试执行一次
date '+%Y%m%d' -d "20181222+30 days"
20190121
我不知道你为什么需要这个
awk
,好像你有GNUdate
,如果是的话,那么试一下
date '+%Y%m%d' -d "20181222+30 days"
20190121
这是很有趣的描述为什么你会得到你得到的结果 在awk中,不带引号的单词(不是函数或命令)是一个变量:
awk 'BEGIN { print date -d $(date -d "20181222" "+%Y%m%d") + 30}'
这里,有两个“date”变量,两个“d”变量,两个带引号的字符串和一个数字文本
由于“date”和“d”作为变量尚未初始化,因此它们被视为空字符串或数字零,具体取决于上下文。因为您在“日期”和“d”之间使用了-
,所以您将它们放在数字上下文中
还请注意:
- awk字符串重叠就是简单地将两个字符串并排放置:没有显式运算符
符号可以描述为“字段值解引用”运算符:$
右侧的单词是要使用的字段编号$
- 在BEGIN块中,awk尚未处理任何记录,因此任何
都将成为空字符串$x
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中本机执行日期算术:请参阅 幸运的是,GNU awk的datetime库将“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中,不带引号的单词(不是函数或命令)是一个变量:
awk 'BEGIN { print date -d $(date -d "20181222" "+%Y%m%d") + 30}'
这里,有两个“date”变量,两个“d”变量,两个带引号的字符串和一个数字文本
由于“date”和“d”作为变量尚未初始化,因此它们被视为空字符串或数字零,具体取决于上下文。因为您在“日期”和“d”之间使用了-
,所以您将它们放在数字上下文中
还请注意:
- awk字符串重叠就是简单地将两个字符串并排放置:没有显式运算符
符号可以描述为“字段值解引用”运算符:$
右侧的单词是要使用的字段编号$
- 在BEGIN块中,awk尚未处理任何记录,因此任何
都将成为空字符串$x
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中本机执行日期算术:请参阅 幸运的是,GNU awk的datetime库将“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
$ awk -v d=30 'BEGIN{cmd="date -d \"20181222+" d "days\" +\"%Y%m%d\"";
cmd | getline date; print "date:" date}'
date:20190121
您可以在
awk
$ awk -v d=30 'BEGIN{cmd="date -d \"20181222+" d "days\" +\"%Y%m%d\"";
cmd | getline date; print "date:" date}'
date:20190121
不幸的是,我不得不使用awk。如果有另外一种方法使用awk来计算天数,而不使用“日期”,那么这种方法是不起作用的。不幸的是,我不得不使用awk。如果有另一种方法可以使用不带“date”的awk来计算天数,那么这种方法是不起作用的。我不认为在这一点上引用了前0<代码>打印“0”$(“020181222+%Y%m%d”)+30}。它应该是
0(“+30)
然后0 30
谢谢@glenn。这将是有用的。非常好的故障!我不认为在这一点上引用了前0<代码>打印“0”$(“020181222+%Y%m%d”)+30}。它应该是0(“+30)
然后0 30
谢谢@glenn。这将是有用的。非常好的故障cmd | getline date
->date=((cmd | getline)>0?行:“-1”);关闭(cmd)
以获得稳健性等cmd | getline date
->date=((cmd | getline)>0?行:“-1”);关闭(cmd)
以增强稳健性等。