在AWK中编写脚本 - 输入数据 - 格式为31.12.2012
的时间。我想比较2个日期 - 系统日期和这个日期。我认为最好的方法是将两个日期转换为unix时间戳,进行演绎,然后与条件进行比较。只能使用此格式2012-12-31
将日期转换为unix时间戳。要转换为这种格式,我写了SED表达式sed -n -e "s_\(..\)\(.\)\(..\)\(.\)\(....\)_\5-\3-\1_p"
。然后我们必须使用命令date --utc --date "2012-12-31" +%s
转换此表达式。但管道不想工作。
在AWK中我写道:
#/usr/bin/awk -f
BEGIN {
FS=",";
}
{
split($3, account, "/");
gsub(/ $/, "", account[1]);
split($4, products, "\\\\n");
split($5, supports, "\\\\n");
for (i in products) {
gsub("\"", "", products[i]);
gsub("\"", "", supports[i]);
split(supports[i], timesupport, "\ > ");
"date +%s" | getline dateVal;
print timesupport[1] | sed -n -e "s_\(..\)\(.\)\(..\)\(.\)\(....\)_\5-\3-\1_p" | getline timeVal1 | date --utc --date "timeVal1" +%s | getline timeVal;
x=dateVal - timeVal;
if (supports[i] !~ /n\\\\a*/ && supports[i] !~ /n\/a*/ && $2 !~ /\NULL/)
print $1","$2","timesupport[1]","account[1]"\","products[i]"\","$6;
}
}
主要帖子是在帖子12634588.谢谢!
答案 0 :(得分:4)
为什么不使用内置时间函数:
(echo | awk '{ print systime() }'; date +%s)
1348915323
1348915323
要将您提到的字符串转换为相同的格式,请使用mktime
:
{
t = "31.12.2012"
split(t, a, "\\.")
ts = sprintf("%04d %02d %02d 00 00 00", a[3], a[2], a[1])
print mktime(ts)
}
输出:
1356908400
答案 1 :(得分:1)
看起来你正试图混合使用bash和awk代码。尝试使用system()调用在bash中执行代码并在awk中返回结果。
答案 2 :(得分:1)
system()
函数和getline
命令实际将其参数传递给/bin/sh
。这允许您像在shell中一样使用管道。例如:
cmd = sprintf("echo '%s' | sed -e '...'", timesupport[1])
cmd | getline timeval
你的问题并没有明确说明脚本的输入是什么,所以我不能给你一个更相关的例子。