Unix 改进AWK脚本-比较和添加字段
我有一个用分号分隔的CSV文件,该文件包含对客户评论的情绪分析 视图按字段1和6分组,我要做的是添加组中每行的最后字段,然后将总和与字段3进行比较。如果它们匹配,则比较值等于1(如果不是0)。 同时,我还比较了应用上述相同规则的字段6和字段7 最后,分别计算两次比较得到的数量 下面我有一个脚本,但我认为它可以改进。有什么建议吗?此外,我也不确定脚本是否良好Unix 改进AWK脚本-比较和添加字段,unix,awk,gawk,Unix,Awk,Gawk,我有一个用分号分隔的CSV文件,该文件包含对客户评论的情绪分析 视图按字段1和6分组,我要做的是添加组中每行的最后字段,然后将总和与字段3进行比较。如果它们匹配,则比较值等于1(如果不是0)。 同时,我还比较了应用上述相同规则的字段6和字段7 最后,分别计算两次比较得到的数量 下面我有一个脚本,但我认为它可以改进。有什么建议吗?此外,我也不确定脚本是否良好 BEGIN { OFS=FS=";"; flag=""; counter1=0; counter2=0;
BEGIN {
OFS=FS=";";
flag="";
counter1=0;
counter2=0;
counter3=0;
}
{
number=$1;
topic=$6;
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[$1";"$6]=topics[$1";"$6] ";"$6";"$7;
to_print[$1";"$6]=$1";"$2";"$3";"$4";"$5";"$6
polarity[$1";"$6]=$3;
}
END {
print ""
print "#### - sentiments: "counter3" - topic: "counter1 " - polarity: "counter2;
}
输出:
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=$1 FS $3 FS $6;
sum[key]+=$(NF-1);
line[key]=$1 FS $2 FS $3 FS $4 FS $5 FS $6;
sign[key]=($3=="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
$awk-F';'-v OFS=';'
{key=$1 FS$3 FS$6;
和[键]+=$(NF-1);
行[键]=$1fs$2fs$3fs$4fs$5fs$6;
符号[键]=($3==“负”?-1:1)
}
结束{for(总和为k)
打印行[k],(求和[k]*符号[k]听起来您应该请求迁移到。对于长度超过两行的脚本,请使用有意义的变量名。像k1、k2、b1、x1、x2、xd、s等名称都没有用处。因此,我必须在该部分中回答同样的问题?
$ awk -F';' -v OFS=';' '
{key=$1 FS $3 FS $6;
sum[key]+=$(NF-1);
line[key]=$1 FS $2 FS $3 FS $4 FS $5 FS $6;
sign[key]=($3=="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