改进 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),同时还添加了总和和符号信息(最后两个字段)。
我有一个用分号分隔的 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),同时还添加了总和和符号信息(最后两个字段)。