如何在流程中处理awk中的时间函数

如何在流程中处理awk中的时间函数,awk,Awk,有文件test.txt ABCDEF 2019-09-16 02:45:49 ABCDEF 2019-09-16 02:26:27 ABCDEF 2019-09-16 02:15:23 需要与Unix时间一样的答案: ABCDEF 1568583949 ABCDEF 1568582787 ABCDEF 1568582123 我正在使用这个AWK代码 cat test.txt|sed 's/[-:]/ /g'|awk '{print $1, mktime("$2,$3,$4,$5,$6,$7"

有文件
test.txt

ABCDEF 2019-09-16 02:45:49
ABCDEF 2019-09-16 02:26:27
ABCDEF 2019-09-16 02:15:23
需要与Unix时间一样的答案:

ABCDEF 1568583949
ABCDEF 1568582787
ABCDEF 1568582123
我正在使用这个AWK代码

cat test.txt|sed 's/[-:]/ /g'|awk '{print $1, mktime("$2,$3,$4,$5,$6,$7")}'
但我得到了错误的答案。我怎样才能修好它

ABCDEF -1
ABCDEF -1
ABCDEF -1

你能试试下面的吗

awk '{val=$2;val2=$3;gsub(/-/," ",val);gsub(/:/," ",val2);print $1,mktime(val OFS val2)}' Input_file
awk '
match($0,/[0-9]+-[0-9]+-[0-9+ [0-9]+:[0-9]+:[0-9]+/){
  val=substr($0,RSTART,RLENGTH)
  gsub(/:|-/," ",val)
  print $1,mktime(val)
}
'   Input_file
或者(不使用
$2
$3
的变量,请尝试:

awk '{gsub(/-/," ",$2);gsub(/:/," ",$3);print $1,mktime($2 OFS $3)}' Input_file
通用解决方案:如果不想硬编码日期和时间字段,请尝试以下操作

awk '{val=$2;val2=$3;gsub(/-/," ",val);gsub(/:/," ",val2);print $1,mktime(val OFS val2)}' Input_file
awk '
match($0,/[0-9]+-[0-9]+-[0-9+ [0-9]+:[0-9]+:[0-9]+/){
  val=substr($0,RSTART,RLENGTH)
  gsub(/:|-/," ",val)
  print $1,mktime(val)
}
'   Input_file


修复OP的尝试:虽然这应该通过单个
awk
等来完成,但只需在此处修复代码即可

sed 's/[-:]/ /g' Input_file |awk '{print $1, mktime($2 FS $3 FS $4 FS $5 FS $6 FS $7)}'
来自
manawk
关于
mktime

mktime(datespec)将datespec转换为与 由systime()返回,并返回结果 格式为YYYY MM DD HH MM SS[DST]的字符串。的内容 字符串是六个或七个数字,分别代表整个字符串 年份包括世纪,从1月到12月,每月的第二天 从1到31,一天中的小时从0到23,分钟从0到 59,第二个从0到60,以及可选的日间节能标志。 这些数字的值不必在规定的范围内; 例如,-1小时表示午夜前1小时 假设原点为0公历,前一年为0 1和第1年-前一年0。假定时间在 本地时区。如果夏令时标志为 正,则假定时间为夏令时;如果为零,则 假定时间为标准时间;如果为负值(默认值), mktime()尝试确定夏令时是否在 如果datespec没有包含足够的 元素,或者如果结果时间超出范围,则mktime()返回 -一,


在包含以下第2列和第3列的组合记录上执行单个
gsub()
将非常容易。由于
gsub()
的第一个参数采用正则表达式参数,您可以提供两个取消限制字符,并坚持将它们替换为单个空格(默认值为
FS


非常感谢详细的解释!很高兴它帮助了你。给它一点时间,你可以从所有答案中选择正确的答案。在这个伟大的网站上,干杯,快乐学习。