0

我正在编写一个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_1有关var_2;他们被重新初始化或什么的。

另外我只想打印var_1and的最终值var_2;目前,它会随着awk.

有什么建议吗?

4

1 回答 1

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_1它将和的值打印var_2为连接字符串(因此 1 和 1 之间没有空格)。

似乎substr()条件或$6条件永远不匹配。

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

至于为什么匹配不匹配,没有任何示例数据可以处理,没有办法说,但是您可以通过打印出每一行的$8和进行调试(而且,也可能是),这样您就可以看到发生了什么.$6mydatesubstr($8,2,8)

如果您只希望在最后打印值,那么(一旦您调试了主要操作期间发生的事情),您可以将printEND 块中:

END { print var_1, var_2 }
于 2013-08-06T07:01:01.037 回答