linux - 以 CSV 格式打印 JSON 中的所有键和值
问题描述
我有几个大的 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
解决方案
为什么需要paste
和其他一堆 shell 工具,当你可以做到这一切的时候jq
jq -r 'to_entries[] | "\(.key),\(.value | .number),\(.value | .word)"' json
推荐阅读
- jestjs - 如果我只传递一个原始值,为什么这个函数会被一个对象调用?
- android - java.lang.AssertionError:使用前必须配置实例
- excel - 使用 VBA 将一系列单元格从一个工作表复制到另一个工作表
- python - “[Errno 2] 没有这样的文件或目录”问题
- javascript - 在 useState 反应后立即获得价值
- python - Python mock values using side_effect but for a function which is returning multiple parameters
- javascript - Text paragraph with keywords tagged/highlighted by category
- python - Extract specific columns from file with shell script
- git - Git 合并不起作用,但响应消息已准备好合并
- excel - 在 Powerquery 中删除重复项忽略了我已经对数据进行了排序(因此删除了错误的重复项)