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

onc*_*nce 6 csv arrays bash json jq

我发现jq对于将 tsv 转换为 JSON 文件非常有帮助,但是,我想弄清楚当我的 tsv 中有数组时如何使用 jq 来实现:

name    age    pets
Tim    15    cats,dogs
Joe    11    rabbits,birds
...
Run Code Online (Sandbox Code Playgroud)

理想的 JSON:

[
 {
  name: "Tim",
  age: "15",
  pet:["cats","dogs"]
 },
  name: "Joe",
  age: "11",
  pet:["rabbits","birds"]
 }, ...
]
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的命令:

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

上述命令的输出是:

[
 {
  name: "Tim",
  age: "15",
  pet:"cats,dogs"
 },
  name: "Joe",
  age: "11",
  pet:"rabbits,birds"-
 }, ...
]
Run Code Online (Sandbox Code Playgroud)

hek*_*mgl 7

像这样:

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


pea*_*eak 4

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

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

要跳过标头,只需使用 -R 选项调用 jq,例如:

jq -R -f program.jq input.tsv
Run Code Online (Sandbox Code Playgroud)

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

  • 但是,似乎有两个小问题:每个 {} 之间缺少逗号,以及缺少外部 [],这可以通过将 jq 管道传输到 sed 的/}/},/g;1s/^/[/; 来修复。 $s/,$/]/',不知道能不能在jq里面解决? (3认同)