2015-12-29 2 views
0

У меня есть 52 файла json (r $ i.json), содержащий каждый 25 результатов (от 0 до 24). Я хотел бы создать json-файл со специальным именем для каждого из этих результатов. Имя будет состоять в соответствии с содержанием каждого из этих результатов: YYYYMMDDHHMMSS_company_jobtitle.jsonКак я могу выполнить jq вложенные for-loops из bash?

команда генерации имен работают отлично:

#!bin/bash 
for ((j=0;j<=24;j++)) 
do 
    datein=$(jq <"r1.json" ".results[$j].date" | sed 's/"//g') 
    dateout=$(date -d "${datein}" +"%Y%m%d%H%M%S") 
    company=$(jq <"r1.json" ".results[$j].company" | sed 's/,//g;s/"//g;s/ //g') 
    job=$(jq <"r1.json" ".results[$j].jobtitle" | sed 's/,//g;s/"//g;s/ //g') 
    jq <"r1.json" ".results[$j]" > ${dateout}_${company}_${job}.json 
done 

Теперь, когда я заменить r1 на г $ г и добавить ((I = 1; я < = 52; j ++)) это не работает ... Так что я думаю, что моя проблема возникает из вложенного синтаксиса цикла в JQ ...

r1.json будет выглядеть так:

{ 

    "radius" : 25, 
    "totalResults" : 1329, 

    "results" : [ 

       { 
        "jobtitle" : "job1", 
        "company" : "company1, 
        "date" : "Sun, 01 Sep 2015 07:59:58 GMT", 
} 
, 
       { 
        "jobtitle" : "job2", 
        "company" : "company2", 
        "date" : "Sun, 02 Sep 2015 07:59:58 GMT", 
} 
, 
      |...] 
       { 
        "jobtitle" : "job25", 
        "company" : "company25, 
        "date" : "Sun, 25 Sep 2015 07:59:58 GMT", 
} 

    ] 
} 
+1

Вы понимаете, что вы могли бы сделать всю эту логику только в одном вызове 'jq' (для каждого выходного файла)? Это гораздо более мощный скриптовый язык, чем вы здесь считаете. –

+0

Кроме того, «не работает» - ** как ** он не работает? Покажите точное сообщение об ошибке, если вы его получите. –

+0

Спасибо @CharlesDuffy теперь он работает. Мне было бы интересно узнать больше о jq-скриптинговом языке. У вас есть хорошие ссылки для обмена? – crocefisso

ответ

0

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

for ((i=1;i<=kdr;i++)) 
do 
    for ((j=0;j<=24;j++)) 
    do 
    datein=$(jq <"r$i.json" ".results[$j].date" | sed 's/"//g') 
    dateout=$(date -d "${datein}" +"%Y%m%d%H%M%S") 
    company=$(jq <"r$i.json" ".results[$j].company" | sed 's/,//g;s/"//g;s/ //g') 
    job=$(jq <"r$i.json" ".results[$j].jobtitle" | sed 's/,//g;s/"//g;s/ //g') 
    jq <"r$i.json" ".results[$j]" > ${dateout}_${company}_${job}.json 
    done 
done 
1

Вы должны соблюдать синтаксис Баша в вашем for с:

for ((i=0; i<5; i++))

((i=1,i< =52,j++)) не будет работать, использовать ; вместо ,.

+0

Конечно, ты прав, спасибо, я редактировал свой пост. к сожалению, моя проблема не исходит из этой ошибки. – crocefisso

+1

Попробуйте разбить свой скрипт так, чтобы каждая строка имела длину менее 70 символов. Избегайте использования backticks (например, используйте '$ (EXPR)'). Также попробуйте определить и использовать функции (например, функции bash). Разбив свою проблему, вы, вероятно, решите ее. Если нет, это облегчит другим помощь. – peak

+0

@peak, thx для вас советую. Я распустил скрипт и отредактировал вопрос. – crocefisso

0

1) Вы написали, что использовали ваш i-loop ((i = 1; i < = 52; j ++)); это должно быть ((i-1; i<=52; i++))

2) Мы не можем точно видеть, что вы сделали по отношению к r1 и r $ i, поэтому, если (1) не разрешает ваши трудности, возможно, вам стоит дважды проверить, что вы сделали на самом деле то, что необходимо. Должно ли вы изменить «> $ outputname» на «>> $ outputname»?

3) Я подозреваю, что вместо использования s/"//g может быть лучше использовать параметр -r для jq; вы можете также рассмотреть возможность избегать sed (jq 1.5 имеет функции sub и gsub).

4) Как я уже сказал, было бы лучше избавиться от всех обратных шагов.

+0

1) Вы правы, я внесла поправки, thx 2) Проблема в том, что я не могу иметь что-то вроде этого: для i = 1, do для j = 0, j = 2,. .., j = 24 для i = 2, do для j = 0, j = 2, ..., j = 24 ... для i = 52, для j = 0, j = 2 , ..., j = 24 3) Thx для наконечника, я посмотрю документацию jq 4) Я только что редактировал вопрос и удалял их – crocefisso