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)
像这样:
jq -rRs 'split("\n")[1:-1] |
map([split("\t")[]|split(",")] | {
"name":.[0],
"age":.[1],
"pet":.[2]
}
)' input.tsv
Run Code Online (Sandbox Code Playgroud)
如果名称包含任何逗号,我会使用以下内容,这也避免了必须“吸食”输入:
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)
如果您希望结果为数组,只需将上面的整个过滤器括在方括号中即可。