我正在编写一个 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_1
和 var_2
的最终值;目前,awk
的每次迭代都会打印它。
有什么建议吗?
最佳答案
你有两个 block 在每行数据上执行:
{ var_1=1; var_2=1; }
在每次传递时将变量设置为 1。{ 如果(substr($8,2,8)==我的日期){ 如果($6 == 1001){ var_1++; } 否则如果($6 == 1003){ var_2++; } } 打印 var_1 var_2 }
将var_1
和var_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/