JQ Recipes

Barcharts

def barchart($key):
  length as $total
  | map((.[$key] // "null") | tostring)
  | group_by(.)
  | (map({ key: .[0], value: length, title_len: (.[0]|tostring|length) }) ) as $columns
  | $columns
  | sort_by(.value) | reverse
  | (max_by(.title_len)|.title_len) as $padding
  |
  (if (((($columns|length)/$total) > .8) or (($columns|length) > 1000)) then
    [ "IGNORING <\($key)>: \($columns|length) out of \($total) rows", ""]
  else [
    $key,
    ("-" * ($key|length) ),
    map(
    [
      .key, (" " * ($padding-.title_len)),
      "\((.value/$total)*100|tostring|.+".000"|.[0:4])%",
      ( if (.value == 1) then "▊" else ("█" * (((.value/$total)*100) + (.value|log)|round)) end),
      .value
    ] | join(" ")
    ),
    ""
  ] end)
  | flatten
  | join("\n");

def run_barchart:
  . as $data
  | (.[0]|keys) as $cols
  | ($cols | map(. as $col | $data | barchart($col)) | join("\n")) as $barcharts
  | [ $barcharts ]
  | flatten| join("\n")
;
jq -r 'include "recipes"; run_barchart' data/titanic.json
Parents_Children_Aboard
-----------------------
0  75.9% ██████████████████████████████████████████████████████████████████████████████████ 674
1  13.3% ██████████████████ 118
2  9.01% █████████████ 80
5  0.56% ██ 5
3  0.56% ██ 5
4  0.45% ██ 4
6  0.11% ▊ 1

Pclass
------
3  54.9% █████████████████████████████████████████████████████████████ 487
1  24.3% ██████████████████████████████ 216
2  20.7% ██████████████████████████ 184

Sex
---
male    64.5% ███████████████████████████████████████████████████████████████████████ 573
female  35.4% █████████████████████████████████████████ 314

Siblings_Spouses_Aboard
-----------------------
0  68.0% ██████████████████████████████████████████████████████████████████████████ 604
1  23.5% █████████████████████████████ 209
2  3.15% ██████ 28
4  2.02% █████ 18
3  1.80% █████ 16
8  0.78% ███ 7
5  0.56% ██ 5

Survived
--------
0  61.4% ████████████████████████████████████████████████████████████████████ 545
1  38.5% ████████████████████████████████████████████ 342