我有一个包含四列的文件,用“;”分隔看起来像这样:
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