tableau multidimensionnel dans awk

J’ai une petite firebase database comme ci-dessous:

10/08/2011 laptop 4 10/08/2011 laptop 2 10/08/2011 desktop 2 10/08/2011 laptop 1 10/08/2011 pen 5 10/08/2011 pen 2 10/08/2011 waterbottle 8 10/2/2011 ring 11 10/02/2011 waterbottle 5 10/2/2011 ring 2 10/2/2011 ring 4 10/2/2011 keyboard 20 10/2/2011 keyboard 10 11/2/2011 mouse 10 11/2/2011 mouse 4 11/2/2011 mouse 10 11/2/2011 door 55 

Je voulais compter combien de chacun de ces articles étaient vendus chaque jour. J’ai essayé quelque chose avec awk comme ci-dessous, mais ça échoue …

 awk '{arr[$1,$2]++;}END {for (i in arr){ for (j in arr[$i]){print arr[$i,$j];}}}' data 

Des idées, comment le faire ?? J’apprécierai votre aide. Merci

Les tableaux Awk sont des correspondances entre les clés et les valeurs. Ce que vous avez produit en essayant d’obtenir un tableau multidimensionnel est en réalité un tableau avec des clés plus complexes. Ainsi, vous devez parcourir les clés combinées, pas les index que vous avez utilisés pour les créer:

 awk '{ arr[$1,$2]++ } END {for (key in arr){ print arr[key] } }' data 

Vous pouvez le faire avec GNU awk 4.0 :

 awk 'END { for (D in d) for (E in d[D]) print E, d[D][E] } { d[$1][$2]++ }' infile 

Dans la plupart des cas, la solution publiée par @Michael J. Barber sera suffisante.

Avec GNU awk 4.0, vous pouvez également facilement commander les valeurs (dans cet exemple, en fonction de la quantité vendue):

 % awk 'END { PROCINFO["sorted_in"] = "@val_num_desc" for (D in d) { split(D, t, SUBSEP) print t[1], t[2], d[D] } } { d[$1, $2]++ }' infile 11/2/2011 mouse 3 10/2/2011 ring 3 10/08/2011 laptop 3 10/2/2011 keyboard 2 10/08/2011 pen 2 10/08/2011 desktop 1 11/2/2011 door 1 10/08/2011 waterbottle 1 10/02/2011 waterbottle 1