Ich habe folgende Ausgabe:
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
Und ich möchte ein Histogramm zeichnen
2015/1/7 ===
2015/1/8 ===========
2015/1/9 ==========
2015/1/10 ====================================================================
2015/1/11 ===
2015/1/11 =
...
Wissen Sie, ob es einen Bash-Befehl gibt, mit dem ich das tun kann?
Antworten:
Versuchen Sie dies in Perl :
ERLÄUTERUNGEN:
-a
ein explizites werdesplit()
in@F
Array, erhalten wir die Werte mit$F[n]
x
ist, Perl anzuweisen, ein Zeichen N-mal zu drucken($F[1] / 5)
: Hier bekommen wir die Zahl und teilen sie durch 5 für eine schöne Druckausgabequelle
perl -lane 'print $F[0], "\t", $F[1], "\t", "=" x ($F[1] / 3 + 1)'
Es sieht wirklich toll aus :) DankeIn
perl
:e
Bewirkt, dass der Ausdruck ausgewertet wird, sodass ich ihn=
mit dem Wert von$1
(der Zahl, die mit übereinstimmt(\d+)
) wiederhole ."="x($1\/3)
anstatt"="x$1
kürzere Zeilen zu erhalten. (Das/
wird ausgeblendet, da wir uns mitten in einem Ersetzungsbefehl befinden.)In
bash
(inspiriert von dieser SO-Antwort ):printf
Füllt die zweite Zeichenkette mit Leerzeichen auf, um eine Breite von$n
(%${n}s
) zu erhalten, und ich ersetze die Leerzeichen durch=
.\t
) abgegrenzt , Sie können sie jedoch schöner gestalten, indem Sie eine Pipeline an sendencolumn -ts'\t'
.$((n/3))
stattdessen verwenden${n}
, um kürzere Zeilen zu erhalten.Andere Version:
Der einzige Nachteil, den ich sehen kann, ist, dass Sie die
sed
Ausgabe an etwas weiterleiten müssen, wenn Sie die Größe verringern möchten. Andernfalls ist dies die sauberste Option. Wenn es eine Chance gibt, dass Ihre Eingabedatei eine von[?*
Ihnen enthält, sollten Sie den Befehl w / ausführenset -f;
.quelle
%*s
obwohl es der ersteprintf
Trick war, den ich in der C-Programmierung gelernt habe.printf(sed) | tr
Soweit ich das beurteilen kann, funktioniert die Version hier nicht.Einfach mit
awk
Oder mit meiner Lieblingsprogrammiersprache
quelle
Wie wäre es mit:
Welches produziert:
quelle
Dies erschien mir als lustiges traditionelles Kommandozeilenproblem. Hier ist meine
bash
Skriptlösung:Das kleine obige Skript geht davon aus, dass sich die Daten in einer Datei befinden, die einfallsreich als "Daten" bezeichnet wird.
Ich bin nicht sehr zufrieden mit der Zeile "Durchsuchen und sortieren" - es wäre unnötig, wenn Ihr Monat und Tag des Monats immer zwei Ziffern hätten, aber das ist das Leben.
Außerdem enthielten traditionelle Unixe ein Dienstprogramm zum Zeichnen über die Befehlszeile, mit dem ziemlich hässliche ASCII-Diagramme und -Diagramme erstellt werden konnten. Ich kann mich nicht an den Namen erinnern, aber es sieht so aus, als ob GNU-Plotutils das alte traditionelle Dienstprogramm ersetzen.
quelle
if ($1 in count) ...
?Gute Übung hier. Ich habe die Daten in einer Datei namens "data" abgelegt, weil ich sehr einfallsreich bin.
Nun, Sie haben in bash danach gefragt ... hier ist es in purer bash.
awk ist eine bessere Option.
quelle
Versuche dies:
Der einzige schwierige Teil ist der Bau der Bar. Ich mache es hier, indem ich an diese SO-Antwort delegiere
printf
und sietr
mag .Als Bonus ist es POSIX-konform
sh
.Verweise:
quelle