chrx
chrx

Reputation: 3572

Using jq to access nested arrays

Given this data (it's directly from the census.gov api):

[["P0010001","NAME","state"],
["4779736","Alabama","01"],
["710231","Alaska","02"],
["6392017","Arizona","04"],
["2915918","Arkansas","05"],
["37253956","California","06"],
["5029196","Colorado","08"],
["3574097","Connecticut","09"],
["897934","Delaware","10"],
["601723","District of Columbia","11"],
["18801310","Florida","12"],
["9687653","Georgia","13"],
["1360301","Hawaii","15"],
["1567582","Idaho","16"],
["12830632","Illinois","17"],
["6483802","Indiana","18"],
["3046355","Iowa","19"],
["2853118","Kansas","20"],
["4339367","Kentucky","21"],
["4533372","Louisiana","22"],
["1328361","Maine","23"],
["5773552","Maryland","24"],
["6547629","Massachusetts","25"],
["9883640","Michigan","26"],
["5303925","Minnesota","27"],
["2967297","Mississippi","28"],
["5988927","Missouri","29"],
["989415","Montana","30"],
["1826341","Nebraska","31"],
["2700551","Nevada","32"],
["1316470","New Hampshire","33"],
["8791894","New Jersey","34"],
["2059179","New Mexico","35"],
["19378102","New York","36"],
["9535483","North Carolina","37"],
["672591","North Dakota","38"],
["11536504","Ohio","39"],
["3751351","Oklahoma","40"],
["3831074","Oregon","41"],
["12702379","Pennsylvania","42"],
["1052567","Rhode Island","44"],
["4625364","South Carolina","45"],
["814180","South Dakota","46"],
["6346105","Tennessee","47"],
["25145561","Texas","48"],
["2763885","Utah","49"],
["625741","Vermont","50"],
["8001024","Virginia","51"],
["6724540","Washington","53"],
["1852994","West Virginia","54"],
["5686986","Wisconsin","55"],
["563626","Wyoming","56"],
["3725789","Puerto Rico","72"]]

I want to use jq to generate a file that looks like:

{
  "population": "4779736",
  "state_name": "Alabama",
  "state_code": "01"
}
{
  "population": "710231",
  "state_name": "Alaska",
  "state_code": "02"
}
{
  "population": "6392017",
  "state_name": "Arizona",
  "state_code": "04"
}
// etc...

I have tried:

.[1:999999999999] | {population:.[][0], state_name:.[][1], state_code:.[][2]}

The [1:999999999999] is to remove the first array. It works buuuuut it generates thousands of JS objects, instead of only 53. It appears to be repeating the mapping over and over again. Why is this?

jq can be tested at https://jqplay.org/

Upvotes: 1

Views: 892

Answers (2)

peak
peak

Reputation: 116670

The proposed answer can be improved in two respects:

(1) Instead of the .[1:999999999999] hack, you can simply write .[1:].

(2) The stated goal is to produce a sequence (i.e. stream) of objects, rather than an array of objects. This can be accomplished as follows:

.[1:][] | {population:.[0], state_name:.[1], state_code:.[2]}

Upvotes: 2

chrx
chrx

Reputation: 3572

The correct method is to use map():

.[1:999999999999] | map({population:.[0], state_name:.[1], state_code:.[2]})

Upvotes: 0

Related Questions