【问题标题】:increment variable in awk based on two columns基于两列在awk中增加变量
【发布时间】:2013-08-06 20:33:09
【问题描述】:

我正在编写一个 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 的每次迭代而被打印出来。

有什么建议吗?

【问题讨论】:

    标签: linux shell variables awk count


    【解决方案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 之间没有空格)。

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

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

    至于为什么匹配不匹配,没有任何示例数据可以处理,但您可以通过打印每行的$8$6 (以及mydate)来进行调试; 也可能是substr($8,2,8)),所以你可以看到发生了什么。

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

    END { print var_1, var_2 }
    

    【讨论】:

    • 谢谢,BEGIN,END 是我想要的。条件匹配良好。
    猜你喜欢
    • 2012-02-25
    • 1970-01-01
    • 2012-02-14
    • 2019-05-20
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多