0

以 AWK 格式编写脚本 - 输入数据 - 时间格式31.12.2012。我想比较 2 个日期 - 系统日期和这个日期。我认为最好的方法是将两个日期都转换为unix时间戳,进行扣除,然后与条件进行比较。只有这种格式才能将日期转换为 unix 时间戳2012-12-31。为了转换成这种格式,我写了 SED 表达式sed -n -e "s_\(..\)\(.\)\(..\)\(.\)\(....\)_\5-\3-\1_p"。然后我们必须用 command 转换这个表达式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 中。谢谢!

4

3 回答 3

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
于 2012-09-29T10:44:06.437 回答
1

看起来您正在尝试混合使用 bash 和 awk 代码。尝试使用 system() 调用在 bash 中执行代码并在 awk 中返回结果。

于 2012-09-29T10:08:56.027 回答
1

system()函数和getline命令实际上将它们的参数传递给/bin/sh. 这使您可以像在 shell 中一样使用管道。例子:

cmd = sprintf("echo '%s' | sed -e '...'", timesupport[1])
cmd | getline timeval

您的问题并没有明确说明脚本的输入是什么,所以我不能给您一个更相关的例子。

于 2012-09-29T10:10:17.737 回答