我正在尝试将一个较大的JSON文件(〜4个Mio元素)拆分为单独的文件(每个元素一个文件)。
文件有点像这样:
{
"books": [
{
"title": "Professional JavaScript - \"The best guide\"",
"authors": [
"Nicholas C. Zakas"
],
"edition": 3,
"year": 2011
},
{
"title": "Professional JavaScript",
"authors": [
"Nicholas C.Zakas"
],
"edition": 2,
"year": 2009
},
{
"title": "Professional Ajax",
"authors": [
"Nicholas C. Zakas",
"Jeremy McPeak",
"Joe Fawcett"
],
"edition": 2,
"year": 2008
}
]
}
为了将每本书分成一个单独的文件,我使用以下命令:
cat books.json | jq -c -M '.books[]' | while read line; do echo $line > temp/$(date +%s%N).json; done
对于最后两项,一切正常,因为书名不包含任何引号。但是,在第一个中,\"
被"
替换,这导致损坏的JSON文件,因为随后的解析器-当然-将"
解释为元素的边界。
我尝试使用jq -r
,但这没有帮助。
我正在使用CentOS 7附带的jq版本:
[root@machine]$ jq --version
jq-1.6
有什么建议吗?
您必须对-r
使用read
选项:
read
它防止解释反斜杠转义。
并且您应该引用变量。
查看区别:
while read -r line; do echo "$line" > temp/"$(date +%s%N)".json; done
几乎总是需要将$ read var <<< 'quoted quotes: \"\"'
$ echo "$var"
quoted quotes: ""
$ read -r var <<< 'quoted quotes: \"\"'
$ echo "$var"
quoted quotes: \"\"
与-r
一起使用,并且实际上应该是默认的行为。
非常感谢,成功了!保存了我的一天!