对列求和并计算另一列的不同值

对列求和并计算另一列的不同值

我有一个包含四列的文件,用“;”分隔看起来像这样:

Articles;Qty;Sales;Customers
ArticleA;2;6;Customer1
ArticleA;3;9;Customer2
ArticleA;5;15;Customer1
ArticleA;4;12;Customer1
ArticleB;1;2;Customer2
ArticleB;2;4;Customer1
ArticleC;3;3;Customer2

我想对每篇文章的第 2 列和第 3 列进行求和,我可以使用以下命令来完成此操作:

awk -F ';' 'NR>1 {a[$1]+=$2; b[$1]+=$3} END {for (i in a) print i, a[i], b[i]}' File

但现在我还想知道有多少不同的客户购买了这篇文章。不幸的是,我做不到。有人可以告诉我我的 awk 命令应该如何才能得到以下结果:

Articles;Qty;Sales;Count of different customers
ArticleA;14;42;2
ArticleB;3;6;2
ArticleC;3;3;1

答案1

假设您有awk用于真正多维数组的 GNU 以及适用length()于数组的函数,则可以执行以下操作:

gawk -F';' -v OFS=';' 'FNR==1{print "Articles;Qty;Sales;Count of different customers";next}
                       {qty[$1]+=$2;sls[$1]+=$3;cust[$1][$4]}
                       END{for (a in qty) {print a,qty[a],sls[a],length(cust[a])}}' input.ssv 

输入文件的结果将是

Articles;Qty;Sales;Count of different customers
ArticleA;14;42;2
ArticleB;3;6;2
ArticleC;3;3;1

该计划将

  • 按原样打印第一行并跳到下一行执行
  • 将关联数组中的数量和销售数字相加qty,并将sls文章作为“数组索引”
  • 将每个客户注册在二维数组中,其中第一个索引是文章,第二个索引是客户名称

最后,程序将迭代所有文章(取自数组的索引qty)并打印文章、总数量、总销售额以及该文章的客户数组的“长度”,这相当于不同的数量顾客。

答案2

awk

awk 'BEGIN{ FS=OFS=";" }
      NR>1{ s1[$1]+=$2; s2[$1]+=$3; c[$1, $4]=$1 }
END{
    print "Articles", "Qty", "Sales", "Count of different customers" 
    for(x in c) cs[c[x]]++; for(i in cs) print i, s1[i], s2[i], cs[i]
}' infile

相关内容