基于两列的awk中的增量变量

时间:2013-08-06 00:28:30

标签: linux shell variables awk count

我正在编写一个awk脚本来解析CSV文件,比较一个包含日期的列和另一个包含活动类型的列,然后打印特定活动的计数。

我写的代码是:

NOW=$(date --date="5 days ago" +"%Y%m%d")
awk -F "," -v mydate=$NOW '{
    var_1=1;
    var_2=1;} {
    if ( substr($8,2,8) == mydate ) {
                if ( $6 == 1001 ) {
                    var_1++;
                }
                else if ( $6 == 1003 ) {
                    var_2++;
                }
    }
    print var_1 var_2
}' *.csv

我得到的输出是

11
11
11
11
11
11

我认为这个问题与我定义var_1var_2的方式有关;他们是重新初始化的东西。

另外,我想只打印var_1var_2的最终值;目前,每次迭代awk都会打印出来。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您在每行数据上执行了两个块:

  1. { var_1=1; var_2=1; }在每次传递时将变量设置为1。
  2. { if ( substr($8,2,8) == mydate ) { if ( $6 == 1001 ) { var_1++; } else if ( $6 == 1003 ) { var_2++; } } print var_1 var_2 }var_1var_2的值打印为连接字符串(因此1和1之间没有空格)。
  3. 似乎substr()条件或$6条件都没有匹配。

    你可能在第一个阻止之前需要BEGIN,但为什么你从1开始而不是0开始并不明显。如果您将计数开始为0,则不需要BEGIN块。您应该使用print var_1, var_2来分隔这两个值。

    至于为什么匹配不匹配,没有任何方法可以说没有任何样本数据,但您可以通过为每行打印$8$6进行调试(和{ {1}};也许mydate),所以你可以看到发生了什么。

    如果您只想在最后打印值,那么(一旦您调试了主要操作期间发生的事情),您可以将substr($8,2,8)放在END块中:

    print