Рисование гистограммы от команды удара производится

Вы могли также усилить tmpwatch http://linux.die.net/man/8/tmpwatch, с помощью, какой бы ни параметры atime, ctime, или mtime удовлетворите своим потребностям.

Например, tmpwatch --atime 30d /foo удалит все файлы в / нечто, к которым не получили доступ за 30 дней.

31
08.11.2018, 00:52
8 ответов

Попробуйте это в :

perl -lane 'print $F[0], "\t", "=" x ($F[1] / 5)' file

Объяснения:

  • - - это явное Split () в @F Массив, мы получаем значения с $ f [n]
  • x , чтобы сообщить Perl распечатать символ N раз
  • ($ F [1] / 5) : Здесь мы получаем номер и разделите его на 5 для симпатичного печатания
12
27.01.2020, 19:38

Легко с awk

awk '{$2=sprintf("%-*s", $2, ""); gsub(" ", "=", $2); printf("%-10s%s\n", $1, $2)}' file

2015/1/7 ========
2015/1/8 =================================================
2015/1/9 ========================================
..
..

или с моим любимым языком программирования

python3 -c 'import sys
for line in sys.stdin:
  data, width = line.split()
  print("{:<10}{:=<{width}}".format(data, "", width=width))' <file
6
27.01.2020, 19:38

Приятное упражнение здесь. Я бросил данные в файл под названием «Данные», потому что я очень творчески.

Ну, вы попросили об этом в Bash ... вот в чистом баш.

cat data | while read date i; do printf "%-10s " $date; for x in $(seq 1 $i); do echo -n "="; done; echo; done

awk - лучший вариант.

awk '{ s=" ";while ($2-->0) s=s"=";printf "%-10s %s\n",$1,s }' data
1
27.01.2020, 19:38

Это ударило меня как веселая традиционная проблема командной строки. Вот мои Bash Решение скрипта :

awk '{if (count[$1]){count[$1] += $2} else {count[$1] = $2}} \
        END{for (year in count) {print year, count[year];}}' data |
sed -e 's/\// /g' | sort -k1,1n -k2,2n -k3,3n |
awk '{printf("%d/%d/%d\t", $1,$2,$3); for (i=0;i<$4;++i) {printf("=")}; printf("\n");}'

Маленький скрипт выше предполагает, что данные находятся в файле Imaginious, названные «Данными».

Я не слишком доволен «бегом через SED и сортировать» - это было бы ненужно, если бы ваш месяц и день месяца всегда имели 2 цифры, но это жизнь.

Кроме того, как историческое примечание, традиционные Unixes приходили с утилитой графиков командной строки, которые могут сделать довольно уродливые графики и участки ASCII. Я не могу вспомнить имя, но это выглядит как GNU Plotutils Замените старую традиционную утилиту.

1
27.01.2020, 19:38

Как насчет:

#! /bin/bash
histo="======================================================================+"

read datewd value

while [ -n "$datewd" ] ; do
   # Use a default width of 70 for the histogram
   echo -n "$datewd      "
   echo ${histo:0:$value}

   read datewd value
done

Что приводит к:

~/bash $./histogram.sh < histdata.txt
2015/1/7    ========
2015/1/8    =================================================
2015/1/9    ========================================
2015/1/10   ======================================================================+
2015/1/11   ===========
2015/1/12   ===
2015/1/13   =========
2015/1/14   ======================================================================+
2015/1/15   ==============================================================
2015/1/16   ==========
2015/1/17   ==============================
2015/1/18   ==============================
2015/1/19   =
2015/1/20   ===
2015/1/21   =======================
2015/1/22   ============
2015/1/24   ======
2015/1/25   ===
2015/1/27   ==
2015/1/28   ================
2015/1/29   =
2015/2/1    ============
2015/2/2    ==
2015/2/3    =
2015/2/4    ==========
2015/2/5    =============
2015/2/6    ==
2015/2/9    ==
2015/2/10   =========================
2015/2/11   =
2015/2/12   ======
2015/2/13   ============
2015/2/14   ==
2015/2/16   ========
2015/2/17   ========
2015/2/20   =
2015/2/23   =
2015/2/27   =
2015/3/2    ===
2015/3/3    ==
~/bash $
4
27.01.2020, 19:38

В perl :

perl -pe 's/ (\d+)$/"="x$1/e' file
  • e вызывает вычисление выражения, поэтому я получаю повторение = с использованием значения $ 1 ( число, соответствующее (\ d +) ).
  • Вы можете ввести "=" x ($ 1 \ / 3) вместо "=" x $ 1 , чтобы получить более короткие строки. ( / экранируется, поскольку мы находимся в середине команды подстановки.)

В bash (на основе этого SO-ответа ):

while read d n 
do 
    printf "%s\t%${n}s\n" "$d" = | tr ' ' '=' 
done < test.txt
  • printf заполняет вторую строку пробелами, чтобы получить ширину $ n (% $ {n} s ), и я заменяю пробелы на = .
  • Столбцы разделены табуляцией ( \ t ), но вы можете сделать их красивее, подключив столбец -ts '\ t' .
  • Для получения более коротких строк можно использовать $ ((n / 3)) вместо $ {n} .

Другая версия:

unset IFS; printf "%s\t%*s\n" $(sed 's/$/ =/' test.txt) | tr ' ' =

Единственный недостаток, который я вижу, это то, что вам нужно направить вывод sed куда-то, если вы хотите уменьшить масштаб, иначе это самый чистый вариант. Если есть вероятность, что ваш входной файл содержит один из [? * , вы должны ввести команду w / set -f; .

12
27.01.2020, 19:38

Prueba esto:

while read value count; do
    printf '%s:\t%s\n' "${value}" "$(printf "%${count}s" | tr ' ' '=')"
done <path/to/my-output

La única parte complicada es la construcción de la barra. Lo hago aquí delegando a printfy trcomo esta respuesta SO .

Como beneficio adicional, es compatible con POSIX -sh-.

Referencias:

2
27.01.2020, 19:38

Вы могли бы сделать что-то подобное с глаголом bar в Miller

$ mlr --nidx --repifs --ofs tab bar -f 2 file
2015/1/7    ***.....................................
2015/1/8    *******************.....................
2015/1/9    ****************........................
2015/1/10   ***************************************#
2015/1/11   ****....................................
2015/1/12   *.......................................
.
.
.
6
16.05.2020, 19:12

Теги

Похожие вопросы