J'ai la sortie suivante:
2015/1/7 8
2015/1/8 49
2015/1/9 40
2015/1/10 337
2015/1/11 11
2015/1/12 3
2015/1/13 9
2015/1/14 102
2015/1/15 62
2015/1/16 10
2015/1/17 30
2015/1/18 30
2015/1/19 1
2015/1/20 3
2015/1/21 23
2015/1/22 12
2015/1/24 6
2015/1/25 3
2015/1/27 2
2015/1/28 16
2015/1/29 1
2015/2/1 12
2015/2/2 2
2015/2/3 1
2015/2/4 10
2015/2/5 13
2015/2/6 2
2015/2/9 2
2015/2/10 25
2015/2/11 1
2015/2/12 6
2015/2/13 12
2015/2/14 2
2015/2/16 8
2015/2/17 8
2015/2/20 1
2015/2/23 1
2015/2/27 1
2015/3/2 3
2015/3/3 2
Et je voudrais dessiner un histogramme
2015/1/7 ===
2015/1/8 ===========
2015/1/9 ==========
2015/1/10 ====================================================================
2015/1/11 ===
2015/1/11 =
...
Savez-vous s'il existe une commande bash qui me permettrait de faire cela?
Réponses:
Essayez ceci en perl :
EXPLICATIONS:
-a
est explicitesplit()
dans@F
tableau, nous obtenons les valeurs avec$F[n]
x
est de dire à perl d'imprimer un caractère N fois($F[1] / 5)
: ici on obtient le nombre et on le divise par 5 pour une jolie sortie impriméela source
perl -lane 'print $F[0], "\t", $F[1], "\t", "=" x ($F[1] / 3 + 1)'
Il a l'air vraiment génial :) merciDans
perl
:e
provoque l'expression à évaluer, donc je suis=
répété en utilisant la valeur de$1
(le nombre correspondant à(\d+)
)."="x($1\/3)
au lieu d'"="x$1
obtenir des lignes plus courtes. (Le/
est échappé car nous sommes au milieu d'une commande de substitution.)Dans
bash
(inspiré de cette réponse SO ):printf
remplit la deuxième chaîne en utilisant des espaces pour obtenir une largeur de$n
(%${n}s
), et je remplace les espaces par=
.\t
), mais vous pouvez le rendre plus joli en le redirigeant verscolumn -ts'\t'
.$((n/3))
au lieu de${n}
pour obtenir des lignes plus courtes.Une autre version:
Le seul inconvénient que je peux voir, c'est que vous aurez besoin de diriger
sed
la sortie de quelque chose si vous voulez réduire, sinon c'est l'option la plus propre. S'il y a une chance que votre fichier d'entrée contienne l'un de[?*
vous, dirigez la commande w /set -f;
.la source
%*s
même si c'était la premièreprintf
astuce liée à la programmation C.printf(sed) | tr
autant que je sache, la version ne fonctionne pas ici.Facile avec
awk
Ou avec mon langage de programmation préféré
la source
Que diriez-vous:
Ce qui produit:
la source
Cela m'a frappé comme un problème amusant de ligne de commande traditionnelle. Voici ma
bash
solution de script:Le petit script ci-dessus suppose que les données se trouvent dans un fichier nommé imaginativement "données".
Je ne suis pas trop content de la ligne "run it through sed and sort" - il ne serait pas nécessaire que votre mois et votre jour de mois aient toujours 2 chiffres, mais c'est la vie.
De plus, comme note historique, les Unix traditionnels étaient livrés avec un utilitaire de traçage en ligne de commande qui pouvait faire des graphiques et des tracés ASCII assez laids. Je ne me souviens pas du nom, mais il semble que les tracés GNU remplacent l'ancien utilitaire traditionnel.
la source
if ($1 in count) ...
?Bon exercice ici. J'ai vidé les données dans un fichier appelé "données" parce que je suis très imaginatif.
Eh bien, vous l'avez demandé en bash ... ici c'est en bash pur.
awk est une meilleure option.
la source
Essaye ça:
La seule partie délicate est la construction de la barre. Je le fais ici en déléguant à
printf
ettr
comme cette réponse SO .En prime, il est compatible
sh
POSIX.Les références:
la source