2015-12-23 2 views
4

Я пытаюсь разбить json-файл на различные json-файлы. Вход (r1.json) выглядит следующим образом:Как создать for-loops с jq в bash

{ 

    "results" : [ 

       { 
      content 1 
} 
, 
{ 
      content 2 
} 
, 
{ 
      content n 
} 

    ] 
} 

Я хотел бы вывод, что п файлов: 1.json, 2.json, n.json. Соответственно содержит {content 1}, {content 2} и {content n}.

Я пробовал:

for i in {0..24}; do cat r1.json | jq '.results[$i]' >> $i.json; done 

Но я следующее сообщение об ошибке: Ошибка: я не определен

+2

Give [shellcheck] (http://www.shellcheck.net) идти! В этом случае он говорит: «Выражения не расширяются в одинарных кавычках, используйте для этого двойные кавычки. –

+0

Отличная ссылка, thx много. Это позволило мне изменить мою команду' code'for i в {0..24}; do jq <"r1.json" ".results [$ i]"> .json; done'code' – crocefisso

ответ

2

Хотя приведенные выше ответы верны, обратите внимание, что вставляя переменные оболочки в JQ сценариев является ужасной идеей для всех, кроме самых тривиальных сценариев. На любом из решений, предусмотренных заменить следующее:

jq ".results[$i]" 

С следующее:

jq --arg i "$i" '.results[$i | tonumber]' 
+0

Большое спасибо за ваш совет @ Santiago Lapresta. Действительно, простая строка, о которой я упоминал выше, работал хорошо, не используя jq -arg, но для чего-то более продуманного возникают проблемы. вы используете jq -arg для вложенных циклов. Например, мой скрипт должен делать что-то вроде [that] (https://www.dropbox.com/s/83ouwgo62eoyov1/SOF.sh?dl=0) – crocefisso

+1

Я не знаю, t действительно понимаю, что делает этот скрипт. Можете ли вы представить более простой пример? Вам не нужны циклы вне jq most o время; просто используйте 'range' внутри jq-процесса. Что касается '--arg', вы можете выполнить более одного вызова' --arg', если вам нужно передать несколько переменных внутри. Также, учитывая сценарий, который вы связываете; вы должны, вероятно, использовать '-r' в jq вместо того, чтобы сбрасывать кавычки с' sed'. –

+0

, наконец, я нашел [решение] (http://stackoverflow.com/questions/34509937/how-can-i-do-jq-nested-for-loops-from-bash) для проблемы с вложенным циклом. Знаете ли вы хорошую документацию, чтобы понять, как работает jq? – crocefisso

2

Попробуйте

for i in {0..24}; do cat r1.json | jq ".results[$i]" >> $i.json; done 

Обратите внимание, что обстреливать переменные не могут быть расширены внутри одиночные кавычки.

IHTH

+0

Огромное вам спасибо! – crocefisso

+1

Примите ответ, который решает ваш вопрос Q, нажав зеленую стрелку в левом верхнем углу ответа :-). Рад, что помогло. – shellter

2

Одиночные кавычки, вероятно, что Мессинг вас. Переменные Bash не разворачиваются в одинарные кавычки. Вы передаете литеральную строку .results[$i] на номер jq. Попробуйте двойные кавычки вместо:

for i in {0..24}; do 
    cat r1.json | jq ".results[$i]" >> $i.json 
done 
Смежные вопросы