2012-09-29 139 views
0

在AWK中编写脚本 - 输入数据 - 时间格式为31.12.2012。我想比较两个日期 - 系统日期和这个日期。我认为最好的方法是将这两个日期转换为unix时间戳,进行演绎,然后与条件进行比较。日期只能以2012-12-31格式转换为unix时间戳。为了转换成这种格式,我写了SED表达式sed -n -e "s_\(..\)\(.\)\(..\)\(.\)\(....\)_\5-\3-\1_p"。然后我们必须用命令date --utc --date "2012-12-31" +%s来转换这个表达式。但管道不想工作。在AWK中使用管道

在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

为什么不使用内置时间函数:

(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

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

1

system()函数和getline命令实际上将它们的参数传递给/bin/sh。这允许你像使用shell一样使用管道。例如:

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

你的问题并不能使它十分清楚的输入脚本是什么,所以我不能给你一个更相关的例子。