改进 AWK 脚本 - 比较和添加字段

Improve AWK script - Compare and add fields

我有一个用分号分隔的 CSV 文件,该文件包含对客户评论的情绪分析。

视图按字段 1 和 6 分组,我要做的是添加组中每一行的最后一个字段,然后将总和与字段 3 进行比较。如果它们匹配,则比较等于 1,如果不匹配0。 同时,我也用上面相同的规则比较了字段 6 和 7。

最后分别计算两次比较得到的个数

我在下面制作了一个脚本,但我认为它可以改进。有什么建议么?我也不确定脚本是否正确..!

BEGIN {
    OFS=FS=";";
    flag="";
    counter1=0;
    counter2=0;
    counter3=0; 
}

{
    number=;
    topic=;
    id= number";"topic;

    if (id != flag)
    {
        for (i in topics)
        {
            if ((sum < 0) && (polarity[i] == "negative") || (sum > 0) && (polarity[i] == "positive"))
            {
                hit_2=1;
                counter2++;
            }
            else
            {
                hit_2=0;
            }

            s=split(topics[i],words,";")
            hit_1=0;
            for (k=1;k<=s;k++)
            {
                if ((words[k] == words[k+1]) && (words[k] != "") || (words[k] == "NULL") && (hit_2 == 1))
                {
                    hit_1=1;
                }

            }

            if (hit_1 == 1)
            {
                counter1++;
            }
            print to_print[i]";"hit_1";"hit_2;

        }

        delete topics;
        delete to_print;
        delete polarity;
        counter3++;
        sum="";
        flag=id;
    }
    sum += $(NF-1);
    topics[";"]=topics[";"] ";"";";
    to_print[";"]=";"";"";"";"";"
    polarity[";"]=;

}
END {
print ""
print "#### - sentiments: "counter3" - topic: "counter1 " - polarity: "counter2;
}

部分输入数据:

100429301;"RESTAURANT#GENERAL";negative;1004293;10042930;place;place;place;good;good;2.000000;
100429301;"RESTAURANT#GENERAL";negative;1004293;10042930;place;place;place;not longer;not longer;-3.000000;
100429331;"FOOD#QUALITY";negative;1004293;10042933;food;food;food;lousy;lousy;-3.000000;
100429331;"FOOD#QUALITY";negative;1004293;10042933;food;food;food;too   sweet;too sweet;3.600000;
100429331;"FOOD#QUALITY";negative;1004293;10042933;food;portions;portion;tiny;tiny;-1.000000;
103269521;"FOOD#QUALITY";positive;1032695;10326952;duck breast special;visit;visit;incredible;incredible;4.000000;

输出:

100429301;"RESTAURANT#GENERAL";negative;1004293;10042930;place;1;1
100429331;"FOOD#QUALITY";negative;1004293;10042933;food;1;1
103269521;"FOOD#QUALITY";positive;1032695;10326952;duck breast special;0;1

#### - sentiments: 57 - topic: 28 - polarity: 39

我重写了一部分,也许你可以进一步扩展。

$ awk -F';' -v OFS=';' '
     {key= FS  FS ;
      sum[key]+=$(NF-1);
      line[key]= FS  FS  FS  FS  FS ;
      sign[key]=(=="negative"?-1:1)
     }
  END{for(k in sum)
         print line[k],(sum[k]*sign[k]<0?0:1),sum[k],sign[k]}' data

100429301;"RESTAURANT#GENERAL";negative;1004293;10042930;place;1;-1;-1
103269521;"FOOD#QUALITY";positive;1032695;10326952;duck breast special;1;4;1
100429331;"FOOD#QUALITY";negative;1004293;10042933;food;1;-0.4;-1

这只会进行第一次检查(我猜是 hit2),同时还添加了总和和符号信息(最后两个字段)。