【问题标题】:Converting tsv with arrays to JSON with jq使用 jq 将带有数组的 tsv 转换为 JSON
【发布时间】:2019-01-26 11:43:47
【问题描述】:

我发现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"-
 }, ...
]

【问题讨论】:

    标签: arrays json bash csv jq


    【解决方案1】:

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

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

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

    jq -R -f program.jq input.tsv
    

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

    【讨论】:

    • 谢谢你的回答,你是对的,我更喜欢只将某些列更改为数组。也很高兴了解 .jq!
    • 但是,似乎有两个小问题:每个 {} 之间缺少逗号,以及缺少外部 [],这可以通过将 jq 传递给 sed 's/}/},/g 来解决;1s/^/[/;$s/,$/]/',不知道能不能在jq里面解决?
    【解决方案2】:

    像这样:

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

    【讨论】:

      猜你喜欢
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 2018-01-09
      • 2018-06-21
      • 2018-05-23
      • 1970-01-01
      相关资源
      最近更新 更多