gpt4 book ai didi

linux - 基于两列在awk中增加变量

转载 作者:太空宇宙 更新时间:2023-11-04 11:21:22 26 4
gpt4 key购买 nike

我正在编写一个 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 的每次迭代都会打印它。

有什么建议吗?

最佳答案

你有两个 block 在每行数据上执行:

  1. { var_1=1; var_2=1; } 在每次传递时将变量设置为 1。
  2. {
    如果(substr($8,2,8)==我的日期){
    如果($6 == 1001){
    var_1++;
    }
    否则如果($6 == 1003){
    var_2++;
    }
    }
    打印 var_1 var_2
    }
    var_1var_2 的值打印为连接的字符串(因此 1 和 1 之间没有空格)。

看来 substr() 条件或 $6 条件永远不会匹配。

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

至于匹配不匹配的原因,没有任何示例数据可以使用,但您可以通过打印出 $8$6 进行调试对于每一行(还有 mydate;也许还有 substr($8,2,8)),这样您就可以看到发生了什么。

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

END { print var_1, var_2 }

关于linux - 基于两列在awk中增加变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18069957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com