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

标签 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 的每次迭代都会打印它。

有什么建议吗?

最佳答案

你有两个 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/

相关文章:

c++ - 使用 glm::vec< 3 , double > 时出错

linux - 用于检查文件是否为 Unix 可执行文件类型的 Shell 脚本

c++ - 关键字 auto 的惊人有用用法

Java 定时器与 Linux Cronjob

java - Linux - 格式化 ls -l 命令

linux - ubuntu 中的 ITHit 凭据问题

Linux Raspbian (raspberry Pi) crontab 未运行 sh。手动运行正常

bash - 在bash脚本中减去两个时间戳

java - 如何从不同的类中增加一个值(在主类中)

optimization - 创建临时变量以增强可读性