Saya memiliki output sebagai berikut:
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
Dan saya ingin menggambar histogram
2015/1/7 ===
2015/1/8 ===========
2015/1/9 ==========
2015/1/10 ====================================================================
2015/1/11 ===
2015/1/11 =
...
Apakah Anda tahu jika ada perintah bash yang akan membiarkan saya melakukan itu?
Jawaban:
Coba ini di perl :
PENJELASAN:
-a
adalah eksplisitsplit()
dalam@F
array, kita mendapatkan nilai dengan$F[n]
x
adalah untuk memberitahu perl untuk mencetak karakter N kali($F[1] / 5)
: di sini kita mendapatkan nomor dan membaginya dengan 5 untuk hasil cetak cantiksumber
perl -lane 'print $F[0], "\t", $F[1], "\t", "=" x ($F[1] / 3 + 1)'
Ini terlihat sangat bagus :) terima kasihDi
perl
:e
menyebabkan ekspresi dievaluasi, jadi saya=
diulang menggunakan nilai$1
(angka yang cocok dengan(\d+)
)."="x($1\/3)
daripada"="x$1
mendapatkan garis yang lebih pendek. (Itu/
lolos karena kita berada di tengah-tengah perintah substitusi.)In
bash
(terinspirasi dari jawaban SO ini ):printf
bantalan string kedua menggunakan spasi untuk mendapatkan lebar$n
(%${n}s
), dan saya mengganti spasi dengan=
.\t
), tetapi Anda dapat membuatnya lebih cantik dengan mem-piping kecolumn -ts'\t'
.$((n/3))
alih-alih${n}
mendapatkan garis yang lebih pendek.Versi lain:
Satu-satunya kekurangan yang bisa saya lihat adalah bahwa Anda harus menyalurkan
sed
output ke sesuatu jika Anda ingin mengurangi, jika tidak, ini adalah pilihan terbersih. Jika ada kemungkinan file input Anda berisi salah satu dari[?*
Anda harus memimpin perintah w /set -f;
.sumber
%*s
meskipun itu adalahprintf
trik terkait pertama yang saya pelajari dalam pemrograman C.printf(sed) | tr
Versi tidak bekerja di sini sejauh yang saya tahu.Mudah dengan
awk
Atau dengan bahasa pemrograman favorit saya
sumber
Bagaimana tentang:
Yang menghasilkan:
sumber
Ini menurut saya sebagai masalah garis perintah tradisional yang menyenangkan. Inilah
bash
solusi skrip saya :Skrip kecil di atas menganggap data ada dalam file yang secara imajinatif dinamai "data".
Saya tidak terlalu senang dengan garis "jalankan melalui sed dan sortir" - itu tidak perlu jika bulan dan hari-bulan Anda selalu memiliki 2 digit, tapi itulah kehidupan.
Juga, sebagai catatan sejarah, Unix tradisional biasanya datang dengan utilitas plot perintah yang bisa membuat grafik dan plot ASCII yang jelek. Saya tidak ingat namanya, tetapi sepertinya GNU plotutils menggantikan utilitas tradisional yang lama.
sumber
if ($1 in count) ...
?Latihan yang bagus di sini. Saya membuang data dalam file yang disebut "data" karena saya sangat imajinatif.
Nah, Anda memintanya dalam bash ... ini murni bash.
awk adalah pilihan yang lebih baik.
sumber
Coba ini:
Satu-satunya bagian yang sulit adalah pembangunan bar. Saya melakukannya di sini dengan mendelegasikan ke
printf
dantr
menyukai jawaban SO ini .Sebagai bonus, POSIX-
sh
-compliant.Referensi:
sumber