У меня есть следующий вывод:
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
И я хотел бы нарисовать гистограмму
2015/1/7 ===
2015/1/8 ===========
2015/1/9 ==========
2015/1/10 ====================================================================
2015/1/11 ===
2015/1/11 =
...
Вы знаете, есть ли команда bash, которая позволила бы мне это сделать?
Ответы:
Попробуйте это в Perl :
ПОЯСНЕНИЯ:
-a
является явнымsplit()
в@F
массиве, мы получаем значения с$F[n]
x
это сказать Perl, чтобы напечатать символ N раз($F[1] / 5)
: здесь мы получаем число и делим его на 5 для получения красивого вывода на печатьисточник
perl -lane 'print $F[0], "\t", $F[1], "\t", "=" x ($F[1] / 3 + 1)'
Это выглядит действительно здорово :) спасибоВ
perl
:e
вызывает выражение для оценки, поэтому я=
повторяюсь, используя значение$1
(число соответствует(\d+)
)."="x($1\/3)
вместо того,"="x$1
чтобы получить более короткие строки. (Символ/
экранирован, поскольку мы находимся в середине команды замещения.)В
bash
(вдохновленный этим SO ответом ):printf
дополняет вторую строку пробелами, чтобы получить ширину$n
(%${n}s
), и я заменяю пробелы на=
.\t
), но вы можете сделать их более красивыми, добавив в них ссылкуcolumn -ts'\t'
.$((n/3))
вместо того,${n}
чтобы получить более короткие строки.Другая версия:
Единственный недостаток, который я вижу, это то, что вам нужно будет направить
sed
вывод во что-то, если вы хотите уменьшить масштаб, иначе это самый чистый вариант. Если есть вероятность, что ваш входной файл содержит один из[?*
вас, следует ввести команду w /set -f;
.источник
%*s
хотя это был первыйprintf
трюк, связанный с программированием на Си.printf(sed) | tr
Версия не работает здесь, насколько я могу судить.Легко с
awk
Или с моим любимым языком программирования
источник
Как насчет:
Который производит:
источник
Это показалось мне забавной традиционной проблемой командной строки. Вот мое
bash
решение сценария:В приведенном выше небольшом сценарии предполагается, что данные находятся в файле с оригинальным названием «данные».
Я не слишком доволен строкой «пропусти через sed и sort» - было бы ненужно, если бы в вашем месяце и дне месяца всегда было 2 цифры, но это жизнь.
Кроме того, как историческое примечание, традиционные Unixes раньше поставлялись с утилитой построения графиков командной строки, которая могла делать довольно уродливые графики и графики ASCII. Я не могу вспомнить название, но похоже, что GNU plotutils заменяет старую традиционную утилиту.
источник
if ($1 in count) ...
?Хорошее упражнение здесь. Я поместил данные в файл под названием «данные», потому что я очень изобретательный.
Ну, вы просили об этом в bash ... здесь это в чистом bash.
awk - лучший вариант.
источник
Попробуй это:
Единственная сложная часть - это строительство бара. Я делаю это здесь, делегируя
printf
и мнеtr
нравится этот ТАК ответ .В качестве бонуса, это POSIX-
sh
совместимый.Ссылки:
источник