假设我们有一个长度为5的JSON数组,我们想使用linux命令行工具将该数组拆分为多个长度为2的数组,并将分组的项目保存到不同的文件中。
我使用jq
和split
工具进行了尝试(我对任何可以从bash脚本执行的方法都很满意):
$ echo '[{"key1":"value1"},{"key2":"value2"},{"key3":"value3"},{"key4":"value4"},{"key5":"value5"}]' | jq -c -M '.[]' | split -l 2 -d -a 3 - meta_
$ tail -n +1 meta_*
==> meta_000 <==
{"key1":"value1"}
{"key2":"value2"}
==> meta_001 <==
{"key3":"value3"}
{"key4":"value4"}
==> meta_002 <==
{"key5":"value5"}
前面的命令将项正确地保存到文件中,但是我们需要将它们转换为有效的JSON数组格式。我用--filter
选项累了:
$ echo '[{"key1":"value1"},{"key2":"value2"},{"key3":"value3"},{"key4":"value4"},{"key5":"value5"}]' | jq -c -M '.[]' | split -l 2 -d -a 3 - meta2_ --filter='jq --slurp -c -M'
[{"key1":"value1"},{"key2":"value2"}]
[{"key3":"value3"},{"key4":"value4"}]
[{"key5":"value5"}]
$ tail -n +1 meta2_*
tail: cannot open 'meta2_*' for reading: No such file or directory
但是,它会在屏幕上显示输出,但不会持久保存结果。我尝试转发输出,但得到一个错误:
echo '[{"key1":"value1"},{"key2":"value2"},{"key3":"value3"},{"key4":"value4"},{"key5":"value5"}]' | jq -c -M '.[]' | split -l 2 -d -a 3 - meta2_ --filter='jq --slurp -c -M > $FILE'
...
split: with FILE=meta2_000, exit 2 from command: jq --slurp -c -M > $FILE
有什么建议或更好的方法吗?
编辑:我尝试了双引号@andlrc建议:
$ echo '[{"key1":"value1"},{"key2":"value2"},{"key3":"value3"},{"key4":"value4"},{"key5":"value5"}]' | jq -c -M '.[]' | split -l 2 -d -a 3 - meta2_ --filter="jq --slurp -c -M > $FILE"
bash: -c: line 0: syntax error near unexpected token `newline'
bash: -c: line 0: `jq --slurp -c -M > '
split: with FILE=meta2_000, exit 1 from command: jq --slurp -c -M >
$ cat meta_000 | jq --slurp -c -M
[{"key1":"value1"},{"key2":"value2"}]
5条答案
按热度按时间uubf1zoe1#
在jq过滤器中构建数组会更容易,然后每行拆分为文件。无需额外过滤。
生产:
所以把这些都放在一起。
eoigrqb62#
我使用
jq
和split
工具找到了解决方案。我缺少了双引号,jq
中的'.'
模式,并用反斜杠来修饰$
。lvjbypge3#
JSON解析器xidel可以做您想要的事情,并且可以执行XQuery 3。1 FLWOR表达式与(翻转)Window子句的基本思想是:
要将每个数组保存为json文件,您可以使用Xidel的集成EXPath文件模块:
d8tt03nd4#
jq可能是其他回答中提到的方法。因为我对jq不熟悉,所以我写了一个bash脚本(splitjson)。sh)下面使用非常常见的命令(echo,cat,wc,head,tail,sed,expr)。此脚本将json文件拆分为不超过指定字节数的块。如果在指定的字节数内无法进行拆分(json项很长或每个块指定的最大字节数太小),脚本将停止写入json文件并写入错误。
下面是一个例子,以问题中的数据为例。json:
执行每个块具有最大字节数的脚本的命令是:
结果是:
该脚本处理结尾括号'}'、冒号','和开始括号'|'之间带有空格、制表符和换行符的情况。
我成功地在82 MB的json文件上使用了这个脚本。我希望它能处理更大的文件。
下面是脚本(splitjson.sh):
q7solyqu5#
拆分为两个单独的
jq
调用允许第二个调用使用input
帮助程序一次只处理一个输入。在第二个例子中使用try
帮助器可以让它优雅地处理不完整的行,如果您没有剩下两个输入项的话。...发出,在第一个文件中:
......在第二种情况下: