我有几个大的JSON文件,我需要将它们重写为一个文件,但是我只能以一种讨厌的方式来做到这一点,它会写很多临时文件。让我们看一下我的问题的简化版本example.json
:
{
"a": {
"number": 1,
"word": "foo"
},
"b": {
"number": 2,
"word": "bar"
},
"c": {
"number": 3,
"word": "zebra"
}
}
我想获得:
a,1,foo
b,2,bar
c,3,zebra
我的解决方案:
jq 'keys | .[]' example.json | tr -d '"' > file1.csv
jq '.[] | .number' example.json > file2.csv
jq '.[] | .word' example.json | tr -d '"' > file3.csv
paste -d',' file1.csv file2.csv > file4.csv
paste -d',' file4.csv file3.csv > file5.csv
在上面的代码中,我知道我可以通过编写jq -r '.[] | [.number, .word] | @csv'
而不是jq '.[] | .word'
来简化它,从而避免一半的混乱,但是让它保持这种方式,因为我的问题与管道部分有关
我尝试了多种方法将jq
的输出重定向到paste
,但我从未成功:
paste <$(jq 'keys | .[]' example.json | tr -d '"') file2.csv
paste $(jq 'keys | .[]' example.json | tr -d '"') file2.csv
jq 'keys | .[]' example.json | tr -d '"') | paste file2.csv
如何在不创建中间文件的情况下将jq
的输出放入paste
中?
答案 0 :(得分:2)
当您可以在paste
中完成所有操作时,为什么需要jq
和其他一堆Shell utils
jq -r 'to_entries[] | "\(.key),\(.value | .number),\(.value | .word)"' json
答案 1 :(得分:1)