Question

J'ai une liste de paires délimitées par des tabulations comme celle-ci :

apple  yellow
orange green
apple  red
pear   blue
apple  yellow
apple  yellow

Je souhaite le convertir, à l'aide des outils de ligne de commande Linux, en table :

       yellow green red blue
apple     3     0    1   0
orange    0     1    0   0
pear      0     0    0   1

Puis-je faire cela avec un minimum de scripts à la main ?

Note: je sais comment code ça, merci, la question concerne les outils préexistants, éventuellement avec minimal colle de script.Et awk les programmes, à moins qu'ils ne soient très courts, sont d'ailleurs considérés comme des "scripts".

Note 2: C'est un apprentissage question.Je m'en fiche si la solution est courte ou longue (les plus courtes sont cependant préférables).Je veux apprendre d'autres moyens de résoudre ce problème.

Si je voulais résoudre ce problème de la manière la plus rapide, je ne poserais pas cette question ici, j'irais passer 30 secondes à écrire trois lignes dans la langue que je connais le mieux.

Était-ce utile?

La solution

En bref :

awk '{num[$1,$2]++; fruits[$1]=1; colors[$2]=1}END{for(i in fruits) {for(j in colors) printf("%d ", num[i,j]); printf("\n");}}'

PS.Après coup...Vous pouvez examiner join utilitaire.Associé à des décomptes par champs, cela fera peut-être l'affaire.Mais je promets que ce sera plus poilu.

PP.Je vais l'ajouter ici, car la zone de commentaire est trop exiguë.Alexander, vous avez besoin de quelque chose pour fonctionner sur le système POSIX.Il y a une certaine logique impliquée dans la tâche.Qu'il s'agisse d'un script d'outil ou d'un long tube contenant plusieurs commandes, le montant reste à peu près le même.Comme awk a été conçu pour produire des rapports, c'est le bon outil dans ce cas.
Fondamentalement, vous n'avez pas beaucoup de moyens pour formater le texte - c'est printf utilitaire/intégré ou awk.Dans le premier cas, cela signifie environ trois lignes dans le script et quelques lignes supplémentaires pour produire le résultat.Je pense donc qu'il n'y a pas de chemin plus court.Mais c'est un peu théorique d'après mon expérience limitée mais prolongée.J'aimerais aussi connaître un moyen plus simple s'il y en a un, j'aime aussi apprendre :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top