Eu tenho a seguinte saída:
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
E eu gostaria de desenhar um histograma
2015/1/7 ===
2015/1/8 ===========
2015/1/9 ==========
2015/1/10 ====================================================================
2015/1/11 ===
2015/1/11 =
...
Você sabe se existe um comando bash que me permita fazer isso?
Respostas:
Tente isso em perl :
EXPLICAÇÕES:
-a
é uma explícitasplit()
na@F
matriz, obtemos os valores com$F[n]
x
é dizer ao perl para imprimir um caractere N vezes($F[1] / 5)
: aqui obtemos o número e dividimos por 5 para obter uma saída bonitafonte
perl -lane 'print $F[0], "\t", $F[1], "\t", "=" x ($F[1] / 3 + 1)'
Parece realmente grandes :) ObrigadoEm
perl
:e
faz com que a expressão seja avaliada, por isso sou=
repetido usando o valor de$1
(o número correspondente a(\d+)
)."="x($1\/3)
vez de"="x$1
obter linhas mais curtas. (O/
escapou, pois estamos no meio de um comando de substituição.)In
bash
(inspirado nesta resposta do SO ):printf
preenche a segunda string usando espaços para obter uma largura de$n
(%${n}s
) e substituo os espaços por=
.\t
), mas você pode torná-la mais bonita canalizando paracolumn -ts'\t'
.$((n/3))
vez de${n}
obter linhas mais curtas.Outra versão:
A única desvantagem que vejo é que você precisará canalizar
sed
a saída para algo se quiser reduzir, caso contrário, essa é a opção mais limpa. Se houver uma chance de o seu arquivo de entrada conter um de[?*
vocês, o comando w /set -f;
.fonte
%*s
, apesar de ter sido o primeiroprintf
truque relacionado que aprendi na programação C.printf(sed) | tr
versão não funciona aqui até onde eu sei.Fácil com
awk
Ou com minha linguagem de programação favorita
fonte
E se:
Qual produz:
fonte
Isso me pareceu um divertido problema de linha de comando tradicional. Aqui está a minha
bash
solução de script:O pequeno script acima pressupõe que os dados estão em um arquivo chamado "dados" imaginativamente.
Não estou muito feliz com a linha "execute-o com sed e classifique" - seria desnecessário se seu mês e dia do mês sempre tivessem 2 dígitos, mas é a vida.
Além disso, como uma nota histórica, os Unixes tradicionais costumavam vir com um utilitário de plotagem de linha de comando que podia fazer gráficos e plotagens ASCII bastante feios. Não me lembro do nome, mas parece que os plotutils do GNU substituem o antigo utilitário tradicional.
fonte
if ($1 in count) ...
?Bom exercício aqui. Eu joguei os dados em um arquivo chamado "data" porque sou muito imaginativa.
Bem, você pediu no bash ... aqui está no bash puro.
awk é uma opção melhor.
fonte
Tente o seguinte:
A única parte complicada é a construção do bar. Eu faço isso aqui delegando
printf
etr
gostando desta resposta SO .Como bônus, é
sh
compatível com POSIX .Referências:
fonte