Mam następujące dane wyjściowe:
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
I chciałbym narysować histogram
2015/1/7 ===
2015/1/8 ===========
2015/1/9 ==========
2015/1/10 ====================================================================
2015/1/11 ===
2015/1/11 =
...
Czy wiesz, czy istnieje polecenie bash, które pozwoli mi to zrobić?
Odpowiedzi:
Spróbuj tego w Perlu :
OBJAŚNIENIA:
-a
jest jawnesplit()
w@F
tablicy, otrzymujemy wartości z$F[n]
x
mówi perlowi, żeby wypisał znak N razy($F[1] / 5)
: tutaj otrzymujemy liczbę i dzielimy ją przez 5, aby uzyskać ładny wydrukźródło
perl -lane 'print $F[0], "\t", $F[1], "\t", "=" x ($F[1] / 3 + 1)'
Wygląda naprawdę świetnie :) dziękiW
perl
:e
powoduje, że wyrażenie jest oceniane, więc=
powtarzam się przy użyciu wartości$1
(liczba dopasowana przez(\d+)
)."="x($1\/3)
zamiast"="x$1
krótszych linii. (Znak/
ucieczki, ponieważ jesteśmy w trakcie wykonywania polecenia zmiany).W
bash
(inspirowane tą odpowiedzią SO ):printf
wstawia drugi ciąg za pomocą spacji, aby uzyskać szerokość$n
(%${n}s
), i zastępuję spacje=
.\t
), ale możesz uczynić je ładniejszym przez potokowanie docolumn -ts'\t'
.$((n/3))
zamiast,${n}
aby uzyskać krótsze linie.Inna wersja:
Jedyną wadą, jaką widzę, jest to, że musisz przesłać
sed
dane wyjściowe potoku do czegoś, jeśli chcesz zmniejszyć skalę, w przeciwnym razie jest to najczystsza opcja. Jeśli istnieje szansa, że plik wejściowy zawierający jednego z[?*
was powinien przewodzić polecenie w /set -f;
.źródło
%*s
mimo że była to pierwszaprintf
sztuczka, której nauczyłem się w programowaniu C.printf(sed) | tr
Wersja nie działa tu o ile mogę powiedzieć.Łatwo z
awk
Lub z moim ulubionym językiem programowania
źródło
Co powiesz na:
Który produkuje:
źródło
Uderzyło mnie to w tradycyjny, zabawny problem z wierszem poleceń. Oto moje
bash
rozwiązanie skryptu:W powyższym małym skrypcie założono, że dane znajdują się w pliku wyobraźni o nazwie „dane”.
Nie jestem zbyt zadowolony z linii „przeprowadź przez sed i sortuj” - nie byłoby niepotrzebne, gdyby Twój miesiąc i dzień miesiąca zawsze zawierały 2 cyfry, ale takie jest życie.
Co więcej, jako historyczna notatka, tradycyjne Uniksy były dostarczane z narzędziem do kreślenia linii poleceń, które potrafiło robić dość brzydkie wykresy i wykresy ASCII. Nie pamiętam nazwy, ale wygląda na to, że plotutils GNU zastępują stare tradycyjne narzędzie.
źródło
if ($1 in count) ...
?Ładne ćwiczenie tutaj. Zrzuciłem dane do pliku o nazwie „dane”, ponieważ jestem bardzo pomysłowy.
Cóż, prosiłeś o to w uderzeniu ... tutaj jest w czystym uderzeniu.
awk jest lepszą opcją.
źródło
Spróbuj tego:
Jedyną trudną częścią jest konstrukcja paska. Robię to tutaj, delegując
printf
itr
podoba mi się ta SO odpowiedź .Jako bonus, jest
sh
zgodny z POSIX .Referencje:
źródło