如何在流程中处理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
)
非常感谢详细的解释!很高兴它帮助了你。给它一点时间,你可以从所有答案中选择正确的答案。在这个伟大的网站上,干杯,快乐学习。