Вы могли также усилить tmpwatch
http://linux.die.net/man/8/tmpwatch, с помощью, какой бы ни параметры atime
, ctime
, или mtime
удовлетворите своим потребностям.
Например, tmpwatch --atime 30d /foo
удалит все файлы в / нечто, к которым не получили доступ за 30 дней.
Попробуйте это в Perl :
perl -lane 'print $F[0], "\t", "=" x ($F[1] / 5)' file
-
- это явное Split ()
в @F
Массив, мы получаем значения с $ f [n]
x
, чтобы сообщить Perl распечатать символ N раз ($ F [1] / 5)
: Здесь мы получаем номер и разделите его на 5 для симпатичного печатания Легко с 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
Приятное упражнение здесь. Я бросил данные в файл под названием «Данные», потому что я очень творчески.
Ну, вы попросили об этом в 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
Это ударило меня как веселая традиционная проблема командной строки. Вот мои 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 Замените старую традиционную утилиту.
Как насчет:
#! /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 $
В 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;
.
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 printf
y tr
como esta respuesta SO .
Como beneficio adicional, es compatible con POSIX -sh
-.
Referencias:
Вы могли бы сделать что-то подобное с глаголом 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 *.......................................
.
.
.