AWK;比较时间 - strftime的令人费解的行为

时间:2014-01-21 20:56:50

标签: datetime awk gawk strftime

在Win-7 PC上使用UNXUTILS中的GNU-Awk(gawk)。这个问题涉及strftime(。)以及使用它的时间比较。

跟随how to compare strftime values的讨论,因为我遇到了类似的问题。在金融市场数据中,我有一个日期时间字符串(25美元)给出为“03-APR-2006 09:55:25”(所以时间= substr($ 25,13,​​8))我的目标是计算记录(特别是订单取消记录)在14:00:00(下午2点)之后进入。

在我的代码中,我有一行读取

{ if ($3==3) { 
 { ++CK_NR} 
 { ++CO_NR[$4, substr($25, 1, 11)] }  
 { if (strftime(substr($25, 13, 8)) > ("14:00:00"))\
  {
    { ++CK_LATE_NR }
    { ++CO_LATE_NR[$4, substr($25, 1, 11)] }
  }
 }
}}

刚才意识到我使用的不平等 - if(strftime(substr($ 25,13,​​8))>(“14:00:00”)) - 只有一个字符串在RHS中,我没有将此字符串作为另一个strftime(。)的参数。 令人费解的是,它没有给我一个错误。

我担心虽然它没有产生任何错误,并且代码已经运行,但也许它给了我一些不同于我对代码的意图。在命令提示符窗口中,执行

  

gawk“{print(strftime(\”09:55:25 \“)>(\”14:00:00 \“))}”

确实产生“0”和

  

gawk“{print(strftime(\”09:55:25 \“)<(\”14:00:00 \“))}”

确实产生“1”。 GNU Awk手册(http://www.gnu.org/software/gawk/manual/gawk.html#Time-Functions)几乎没有提供有关有意义比较所需内容的信息。刚刚尝试了上面的删除“strftime”甚至来自LHS,如

  

gawk“{print((\”09:55:25 \“)>(\”14:00:00 \“))}”

  

gawk“{print((\”09:55:25 \“)>(\”14:00:00 \“))}”

并得到了相同的结果。我想确保我得到正确的True / False结果,因为GAWK正在比较时间,而不是它用于进行字符串比较的其他内部规则(导致有限测试只是巧合)。有人能解决这个难题吗?谢谢。最好,

Murgie

1 个答案:

答案 0 :(得分:1)

您似乎正在使用字符串比较。通过比较每个字符串的第一个字符,然后比较每个字符串的第二个字符来比较字符串,依此类推。因此," 10"小于" 9",因为" 1"的ASCII值小于" 0",请参阅http://www.gnu.org/software/gawk/manual/gawk.html#Variable-Typinghttp://en.wikibooks.org/wiki/An_Awk_Primer/Search_Patterns_%282%29#Logic_Operators

如果要对表单上的字符串进行数字比较" xx:yy:zz" (例如" 10:22:45")然后您可以尝试使用gsub(/:/,"",str)

将字符串转换为数字