loading...

Table to json with jq and awk

foursixnine profile image Santiago Zarate Originally published at foursixnine.io on ・1 min read

The problem

Say you have a table that looks like this:

AGGREGATE_NEEDED 1
ARCH x86_64
BASE_TEST_ISSUES NUMBER
BUILD :NUMBER:PACKAGE
DISTRI DISTRIBUTION
FLAVOR Server-DVD-Incidents-Install
INCIDENT_ID 99999

It’s just that it contains about 78 or more entries. Of course for a very skilled engineer or a person with a lot of tricks under the hood, this might be a very trivial task in vim or something like this, I guess that with a couple of replaces here and there, you’d get somewhere; but I’m not skilled, other than at eating.

The Solution

So I took my Key Value table saved it to a file and after googling a bit, now I’m more versed into awk :D:

cat FILE.txt | \ 
    awk 'BEGIN { print "{" } \ 
        { printf "\"%s\":\"%s\",", $1,$2} \ 
        END { print "\"MANUALLY_GENERATED_ISO_POST\":1 }" }'
        | jq > x86_64-ready.json'"}'

I guess this could have been done easier and prettier, but fits my need and might save you too at some point. Just make sure you have jq installed ok?

Posted on by:

foursixnine profile

Santiago Zarate

@foursixnine

I do free and opensource software. I eat. I travel. I take pictures. I bike. I love linguistics. I do @eltravelosaurio and use #travelingtrex.

Discussion

markdown guide
 

I find scripting languages to be much easier to write this stuff in and easier to fix later.

const fs = require('fs');
const data = fs.readFileSync('./FILE.txt').toString();
const lines = data.split('\n');
const json = lines.reduce((acc, l) => {
  const kv = l.split(' ');
  acc[kv[0]] = kv[1];
  return acc,
}, {});
fs.writeFileSync('./file.json', JSON.stringify(json, undefined, 2));

You can also just use the Node REPL for one-off conversions. I use this pattern for CSV to JSON all the time, which would be a nightmare using awk.

 

I guess something similar could be done in Perl, Ruby or any other language capable of reading files and with json object representation capabilities. Thing is, I end up using awk a lot, for many things. But I'll keep your idea in hand and maybe update with a easier to follow $script version. If I ever have to do that again :)

 

Why not just

jq -Rn '[inputs/" "|{(.[0]):.[1]}]|add' file

???

 

@that's even better! \o/ :) Will keep it in mind next time I need to do this! Thanks!