Tengo el siguiente resultado:
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
Y me gustaría dibujar un histograma
2015/1/7 ===
2015/1/8 ===========
2015/1/9 ==========
2015/1/10 ====================================================================
2015/1/11 ===
2015/1/11 =
...
¿Sabes si hay un comando bash que me permita hacer eso?
Respuestas:
Prueba esto en perl :
EXPLICACIONES
-a
es un explícitosplit()
en la@F
matriz, obtenemos los valores con$F[n]
x
es decirle a Perl que imprima un personaje N veces($F[1] / 5)
: aquí obtenemos el número y lo dividimos por 5 para obtener una salida de impresión bonitafuente
perl -lane 'print $F[0], "\t", $F[1], "\t", "=" x ($F[1] / 3 + 1)'
Se ve realmente genial :) graciasEn
perl
:e
hace que se evalúe la expresión, por lo que me=
repiten usando el valor de$1
(el número que coincide(\d+)
)."="x($1\/3)
lugar de"="x$1
obtener líneas más cortas. (Se/
escapa porque estamos en medio de un comando de sustitución).En
bash
(inspirado en esta respuesta SO ):printf
rellena la segunda cadena usando espacios para obtener un ancho de$n
(%${n}s
), y reemplazo los espacios con=
.\t
), pero puede hacerla más bonita canalizando acolumn -ts'\t'
.$((n/3))
lugar de${n}
obtener líneas más cortas.Otra version:
El único inconveniente que puedo ver es que necesitará canalizar
sed
la salida a algo si desea reducir, de lo contrario, esta es la opción más limpia. Si existe la posibilidad de que su archivo de entrada contenga uno de[?*
ustedes, debe dirigir el comando w /set -f;
.fuente
%*s
a pesar de que fue el primerprintf
truco relacionado que aprendí en la programación C.printf(sed) | tr
versión no funciona aquí hasta donde puedo decir.Fácil con
awk
O con mi lenguaje de programación favorito
fuente
Qué tal si:
Que produce:
fuente
Esto me pareció un divertido problema de línea de comando tradicional. Aquí está mi
bash
solución de script:La pequeña secuencia de comandos anterior supone que los datos están en un archivo llamado imaginativamente "datos".
No estoy muy contento con la línea "ejecutarlo a través de sed y ordenar": sería innecesario si su mes y día del mes siempre tuvieran 2 dígitos, pero así es la vida.
Además, como nota histórica, los Unix tradicionales solían venir con una utilidad de trazado de línea de comando que podía hacer gráficos y diagramas ASCII bastante feos. No recuerdo el nombre, pero parece que GNU plotutils reemplaza la antigua utilidad tradicional.
fuente
if ($1 in count) ...
?Buen ejercicio aquí. Volqué los datos en un archivo llamado "datos" porque soy muy imaginativo.
Bueno, lo pediste en bash ... aquí está en puro bash.
awk es una mejor opción.
fuente
Prueba esto:
La única parte difícil es la construcción de la barra. Lo hago aquí delegando
printf
y metr
gusta esta respuesta SO .Como beneficio adicional, es compatible con
sh
POSIX.Referencias
fuente