我正在编写一个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
都会打印出来。
有什么建议吗?
答案 0 :(得分:1)
您在每行数据上执行了两个块:
{ var_1=1; var_2=1; }
在每次传递时将变量设置为1。{
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
和$6
进行调试(和{ {1}};也许mydate
),所以你可以看到发生了什么。
如果您只想在最后打印值,那么(一旦您调试了主要操作期间发生的事情),您可以将substr($8,2,8)
放在END块中:
print