Converting between JSON and TSV
February 13, 2020
Occasionally I want a quick way to convert data between JSON and TSV in BASH scripts. I use these jq
scripts to transform the formats from stdin.
tsv2jsonl() { jq -cRs 'split("\n") | map(split("\t")) | .[0] as $keys | .[1:-1] | map(. as $values | $keys | keys | map({"key":($keys[.]),"value":($values[.])}) | from_entries)[]' ; }
jsonl2tsv() { jq -sr '( .[0] | keys_unsorted ) as $keys | $keys, map([ .[ $keys[] ] ])[] | @tsv' ; }
Example
$
cat holidays.tsv
date holiday
2020-01-01 New Years Day
2020-01-20 Dr Martin Luther King Jr Day
2020-02-17 Presidents Day
2020-05-25 Memorial Day
2020-07-03 Independence Day
2020-09-07 Labor Day
2020-11-26 Thanksgiving
2020-11-27 Thanksgiving
2020-12-24 Winter Holiday
2020-12-25 Winter Holiday
$
# first to json
$
tsv2jsonl < holidays.tsv
{"date":"2020-01-01","holiday":"New Years Day"}
{"date":"2020-01-20","holiday":"Dr Martin Luther King Jr Day"}
{"date":"2020-02-17","holiday":"Presidents Day"}
{"date":"2020-05-25","holiday":"Memorial Day"}
{"date":"2020-07-03","holiday":"Independence Day"}
{"date":"2020-09-07","holiday":"Labor Day"}
{"date":"2020-11-26","holiday":"Thanksgiving"}
{"date":"2020-11-27","holiday":"Thanksgiving"}
{"date":"2020-12-24","holiday":"Winter Holiday"}
{"date":"2020-12-25","holiday":"Winter Holiday"}
$
# chain commands
$
tsv2jsonl < holidays.tsv | jq -c 'select(.holiday | contains(" Day") | not)'
{"date":"2020-11-26","holiday":"Thanksgiving"}
{"date":"2020-11-27","holiday":"Thanksgiving"}
{"date":"2020-12-24","holiday":"Winter Holiday"}
{"date":"2020-12-25","holiday":"Winter Holiday"}
$
# back to tsv
$
tsv2jsonl < holidays.tsv | jq -c 'select(.holiday | contains(" Day") | not)' | jsonl2tsv
date holiday
2020-11-26 Thanksgiving
2020-11-27 Thanksgiving
2020-12-24 Winter Holiday
2020-12-25 Winter Holiday