Предположим, у нас есть массив JSON длиной 5 и мы хотим разбить массив на несколько массивов длины 2 и сохранить сгруппированные элементы в разные файлы, используя инструменты командной строки linux ,Разделите массив JSON на несколько файлов с помощью инструментов командной строки
Я попробовал его с помощью jq
и split
инструментов (я доволен любой подход, который может быть выполнен из Баш скрипт):
$ 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
Любые подсказки или лучшие подходы?
EDIT: Я попытался с двойными кавычками @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 Я могу принять и ответить без использования split, спасибо за совет – Emer