使用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以这种方式计算日期中的天数:

awk 'BEGIN { print date -d $(date -d "20181222" "+%Y%m%d") + 30}'
但是我回来了

030
我期待着

20190121

我拥有的日期是一个字符串。

我不确定您为什么需要
awk
来完成此操作,似乎您拥有GNU
date
,如果是,请尝试执行一次

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

我不知道你为什么需要这个
awk
,好像你有GNU
date
,如果是的话,那么试一下

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基本上看到了这一点:

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基本上看到了这一点:

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)
以增强稳健性等。