我有具有n个json对象的文件,它们被逗号分隔(,(
{"a":1},{"b":2},{"c":3},{"d":2},{"e":1},{"f":2} ...
我想使用jq
[{"a":1},{"b":2},{"c":3},{"d":2},{"e":1},{"f":2} ...]
我尝试了jq -R 'split(",")' myfile.json
,但它给了我一系列n个字符串
[
"{"a":1}",
"{"b":2}",
"{"a":1}",
"{"b":2}",
"{"a":1}",
"{"b":2}",
"{"a":1}",
"{"b":2}" ....
]
有什么想法?
您在正确的轨道上,您只需要将fromjson
映射到数组,例如:
jq -Rc 'split(",") | map(fromjson)' myfile.json
输出:
[{"a":1},{"b":2},{"c":3},{"d":2},{"e":1},{"f":2}]
但是,如果您要处理大量输入,也许使用更流的命令将输入分为块,例如使用tr
:
<myfile.json tr ',' 'n' | jq -c .
输出:
{"a":1}
{"b":2}
{"c":3}
{"d":2}
{"e":1}
{"f":2}
由于您有数百万这些JSON对象,让我首先提出一种有效的方法,以JSON-LINES格式产生它们的流(即,以" Newline"为定界符(。
警告:以下假定对象不包含带有逗号的JSON字符串。
让我们假设逗号分隔对象在名为objects.txt的文件中。首先,创建一个文件,program.jq,并使用以下JQ程序:
def one:
(try input catch null)
| if . == 0 then empty elif . == null then one else (., one) end;
one
然后假设您的外壳允许,请调用:
(cat objects.txt; echo 0) |
sed $'s/,/,\n/g' |
jq -n -c -f program.jq objects.txt
每行将产生流,一个JSON对象。这是一种非常可管理的格式。例如,要产生一个阵列,您可以将上述流将上述流动到jq -s .
但是,如果目标仅生成一个JSON数组,那么如其他地方指出的那样,最有效的方法是将逗号分隔的对象包装在正方形括号中,沿着:
的线(echo "["; cat objects.txt; echo "]")
那么,这里的相关问题也许是:真正的目标是什么?令人怀疑的是,拥有大量的小JSON对象可能比原始逗号分隔的序列或简单的流更有用。