【发布时间】:2017-03-16 02:42:21
【问题描述】:
假设我们有一个长度为 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"}]
【问题讨论】:
-
...您不会接受任何不使用
split的答案? (也就是说:请避免将关于哪些工具是回答问题的最佳方式的偏见放入问题本身)。 -
@CharlesDuffy 我可以在不使用拆分的情况下接受和回答,感谢您的建议