Bash 将awk变量传递给strftime

Bash 将awk变量传递给strftime,bash,csv,awk,gawk,Bash,Csv,Awk,Gawk,我有一个CSV,其中第2列和第3列分别是日期和时间(UTC) Id,Date,Hour,Name,... 1,2016-02-01,13:52,name1,... 2,2016-02-01,11:02,name2,... 3,2016-01-30,17:43,name3,... 4,2016-01-29,20:07,name4,... 5,2016-01-29,20:05,name5,... . . . 我需要将此转换并合并到德国时间(通用,CET/CEST)。我将第一个第二列和第三列连接到一

我有一个CSV,其中第2列和第3列分别是日期和时间(UTC)

Id,Date,Hour,Name,...
1,2016-02-01,13:52,name1,...
2,2016-02-01,11:02,name2,...
3,2016-01-30,17:43,name3,...
4,2016-01-29,20:07,name4,...
5,2016-01-29,20:05,name5,...
.
.
.
我需要将此转换并合并到德国时间(通用,CET/CEST)。我将第一个第二列和第三列连接到一个awk变量中,作为
a
,但是我很难将它作为第二个参数传递给函数
strftime

TZ="Europe/Berlin" awk 'BEGIN { FS=OFS=","} NR!=1 {a=$2" "$3" UTC"} {print strftime("%F %H.%M.%S %Z", a)}' <csv-file>
TZ=“欧洲/柏林”awk'开始{FS=OFS=“,”}NR=1{a=$2”“$3”UTC”}{打印strftime(“%F%H.%M.%S%Z”,a)}'

如何在
strftime
函数中传递awk变量
a

awk
日期处理不像您想象的那样灵活。不能将任意格式的时间戳传递给strftime。我会回到系统日期 下面是一个示例脚本:

$ echo 1,2016-02-01,13:52,name1,... | 
  awk -F, '{cmd = "date -d \"" $2 " " $3 "\" \"+%F %H.%M.%S %Z\""; cmd | getline d; print d}'

2016-02-01 13.52.00 EST

awk
日期处理不像您想象的那么灵活。不能将任意格式的时间戳传递给strftime。我会回到系统日期 下面是一个示例脚本:

$ echo 1,2016-02-01,13:52,name1,... | 
  awk -F, '{cmd = "date -d \"" $2 " " $3 "\" \"+%F %H.%M.%S %Z\""; cmd | getline d; print d}'

2016-02-01 13.52.00 EST

首先,awk是一个强大的文本处理工具,但是对于日期和时间,它并不是很好

如果要使用它的
strftime()
,则必须提供一个awk接受的
时间戳
,例如来自awk的
systime()或mktime()
。但是,如果要进行时区转换,则不能执行
mktime()
命令。因为它将在本地时区加载
datespec

更简单的方法是,使用外部gnu date命令,您可以对日期进行几乎所有的控制

我假设使用awk处理列对您来说不是问题,我只是用date part做了一个示例:

假设您以某种方式创建了一个字符串:
“2016-02-01 13:52 UTC”

这将提供:

2016-02-01 14.52.00 CET

所以时区被转换了。请注意,getline管道之后的
close(cmd)
非常重要。

首先,awk是文本处理的强大工具,但是,对于日期和时间,它不是很好

如果要使用它的
strftime()
,则必须提供一个awk接受的
时间戳
,例如来自awk的
systime()或mktime()
。但是,如果要进行时区转换,则不能执行
mktime()
命令。因为它将在本地时区加载
datespec

更简单的方法是,使用外部gnu date命令,您可以对日期进行几乎所有的控制

我假设使用awk处理列对您来说不是问题,我只是用date part做了一个示例:

假设您以某种方式创建了一个字符串:
“2016-02-01 13:52 UTC”

这将提供:

2016-02-01 14.52.00 CET

所以时区被转换了。注意,getline管道之后的
close(cmd)
非常重要。

a
放在与您尝试使用它的位置相同的范围内?将
a
放在与您尝试使用它的位置相同的范围内?等等,这个结果正确吗<代码>UTC 13:52应该是德国时间
14:52
对吗?它不做转换,是吗?你能给我解释一下变量$2和$3周围的双引号吗?它们实际上在双引号之外,它将字符串和变量连接成日期命令字符串。像这样看“xxx”++$2++“++$3++”xxx。但是,我没有加入TZ,这可能是你的问题。等等,这个结果正确吗<代码>UTC 13:52应该是德国时间
14:52
对吗?它不做转换,是吗?你能给我解释一下变量$2和$3周围的双引号吗?它们实际上在双引号之外,它将字符串和变量连接成日期命令字符串。像这样看“xxx”++$2++“++$3++”xxx。但是,我没有合并TZ,这可能是您的问题。如果/when
cmd | getline
失败,将(可能没有警告)输出先前的
x
值。您需要类似于
if((cmd | getline x)的内容。请注意,
date
-d
选项尤其适用于GNU版本(coreutils)。BSD、Solaris等中的
date
命令的功能不同。这似乎是一个以Linux为中心的操作系统非特定问题的答案。如果/when
cmd | getline
失败,将(可能没有警告)输出先前的
x
。您需要类似
If((cmd | getline x)的东西请注意,
date
-d
选项特别适用于GNU版本(coreutils)。BSD、Solaris等中的
date
命令功能不同。这似乎是以Linux为中心对操作系统非特定问题的回答。