使用数组将带有数组的tsv转换为JSON

时间:2018-08-20 10:50:42

标签: arrays json bash csv jq

我发现jq在将tsv转换为JSON文件中非常有帮助,但是,当我在tsv中有数组时,我想弄清楚如何使用jq进行操作:

name    age    pets
Tim    15    cats,dogs
Joe    11    rabbits,birds
...

理想的JSON:

[
 {
  name: "Tim",
  age: "15",
  pet:["cats","dogs"]
 },
  name: "Joe",
  age: "11",
  pet:["rabbits","birds"]
 }, ...
]

这是我尝试的命令:

cat file.tsv | jq -s  --slurp --raw-input --raw-output 'split("\n") | .[1:-1] | map(split("\t")) |
        map({"name": .[0],
             "age": .[1],
             "pet": .[2]})'

上面命令的输出为:

[
 {
  name: "Tim",
  age: "15",
  pet:"cats,dogs"
 },
  name: "Joe",
  age: "11",
  pet:"rabbits,birds"-
 }, ...
]

2 个答案:

答案 0 :(得分:2)

赞:

jq -rRs 'split("\n")[1:-1] |
         map([split("\t")[]|split(",")] | {
                 "name":.[0],
                 "age":.[1],
                 "pet":.[2]
             }
    )' input.tsv

答案 1 :(得分:2)

如果名称包含任何逗号,我将使用以下内容,这也避免了“输入”输入:

inputs
| split("\t")
| {name: .[0], age: .[1], pet: .[2]}
| .pet |= split(",") 

要跳过标题,只需使用-R选项调用jq即可,例如像这样:

jq -R -f program.jq input.tsv

如果要将结果作为数组,只需将上方的整个过滤器括在方括号中即可。