Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 29/12/2015, à 16:25

crocefisso

Comment faire des boucles imbriquée jq dans bash ? [Résolu]

Bonjour à tous, et joyeuses fêtes,

Voici mon problème :

J'ai 52 fichiers json (r$i.json) contenant chacun 25 résultats (0 à 24). Je voudrais créer un fichier json avec un nom particulier pour chacun de ces résultats. Le nom étant composé selon le contenu de chacun de ces résultats :  AAAAMMJJHHMMSS_entreprise_job.json

La commande qui génère les noms marche bien :

for ((j=0;,j<=24;j++))
do jq <"r1.json" ".results[$j]" > `date -d "$(jq <"r1.json" ".results[$j].date" | sed  's/"//g')" +"%Y%m%d%H%M%S"``echo _``jq <"r1.json" ".results[$j].company" | sed 's/,//g;s/"//g;s/ //g'``echo _``jq <"r1.json" ".results[$j].jobtitle" | sed 's/,//g;s/"//g;s/ //g'`.json
done

Maintenant, j'aimerai remplacer r1 par r$i et ajouter ((i=1;i< =52;j++)), mais ça ne marche pas... Je suppose que mon problème vient de la syntaxe des boucles imbriquées dans jq...

Pour info, r1.json ressemblerait à ça :

{

    "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",
}

    ]
}

Dernière modification par crocefisso (Le 30/12/2015, à 19:45)

Hors ligne

#2 Le 29/12/2015, à 17:18

Watael

Re : Comment faire des boucles imbriquée jq dans bash ? [Résolu]

déjà, tu gagnerais en lisibilité, en maintenabilité, et donc en possibilité d'être aidé, si tu découpais ta commande pour assigner plusieurs variables qui te permettront de reconstruire le nom du fichier de sortie finale.

for ((...))
do
   date_in=$(jq <rN.json ".result[$j].date"
   date_out=$(date -d ... +%...)
   company=$(...)
   ...
   fichierSortie=${date_out}${company}...
   jq <"rN.json > "$fichierSortie"
done

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 29/12/2015, à 21:09

tiramiseb

Re : Comment faire des boucles imbriquée jq dans bash ? [Résolu]

Salut,

Montre ce que tu as fait et qui ne marche pas...

Hors ligne

#4 Le 29/12/2015, à 23:43

crocefisso

Re : Comment faire des boucles imbriquée jq dans bash ? [Résolu]

@Watael, étant un béotien de la programmation (c'est le deuxième script que je fais de ma vie et la première fois que j'utilise des boucles). Je ne connais pas les us et coutumes. Si ça peut aider à me faire comprendre, voici la découpe :

#!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

@tiramiseb, à part ce que je viens de poster, j'ai rien fait d'autre. Ce qui ne va pas dans ma boucle c'est que j'aimerais qu'elle face la chose suivante, mais que je ne sais pas comment faire :

Pour i=1,  faire pour j=0, j=2, ..., j=24
Pour i=2,  faire pour j=0, j=2, ..., j=24
...
Pour i=52,  faire pour j=0, j=2, ..., j=24

Dernière modification par crocefisso (Le 30/12/2015, à 01:40)

Hors ligne

#5 Le 29/12/2015, à 23:48

Compte anonymisé

Re : Comment faire des boucles imbriquée jq dans bash ? [Résolu]

re,

je pense que ça peut le faire, à tester :

#!/bin/sh
i=1
j=0
l=52
while [ "$i" -lt "$l" ]
do
jq ".results[$j]" "r$i.json" > $(date -d "$(jq ".results[$j].date" "r$i.json"|sed  's/"//g')" +"%Y%m%d%H%M%S")_$(jq ".results[$j].company" "r$i.json"|sed 's/,//g;s/"//g;s/ //g')_$(jq ".results[$j].jobtitle" "r$i.json"|sed 's/,//g;s/"//g;s/ //g').json
j++
if [ "$j" == 25 ]
then
i++
j=0
fi
done

Dernière modification par Compte anonymisé (Le 30/12/2015, à 10:29)

#6 Le 30/12/2015, à 00:11

Watael

Re : Comment faire des boucles imbriquée jq dans bash ? [Résolu]

tu dois imbriquer une boucle (c'est ce que tu dis depuis le début, mais ce sont des boucles bash imbriquées, pas jq):

for ((i=1;i<=52;i++))
do
   for ((j=0;j<=24;j++))
   do
      # tes commandes ici
   done
done

note que

outputname=$(`${dateout}``echo _``${company}``echo _``${job}`)

devrait t'afficher une erreur
$dateout est une substitution de commande, qui contient une date, elle ne peut pas être exécutée.
et les echo ne sont pas nécessaires :

outputname=${dateout}_${company}_${job}

KISS *

*Keep It Simple Stupid

Dernière modification par Watael (Le 30/12/2015, à 01:40)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 30/12/2015, à 03:25

tiramiseb

Re : Comment faire des boucles imbriquée jq dans bash ? [Résolu]

Anonyme68: des while avec des incréments !?  O.o
... Ne réinventons pas la roue !!! Dans ce cas, c'est bel et bien des for qu'il faut...

... En tout cas je ne proposerais pas mieux que Watael.

Hors ligne

#8 Le 30/12/2015, à 19:43

crocefisso

Re : Comment faire des boucles imbriquée jq dans bash ? [Résolu]

@Watael merci beaucoup!!!  c'est exactement la solution que je cherchais en vain...

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

Connais-tu une bonne documentation sur les boucles bash ?

@Anonyme68, j'ai trouvé ta solution très intéressante bien que certains aspects m'échappent, je pense que je pourrais réutiliser l'esprit dans d'autres cas de figure. Aurais-tu des liens pour approfondir la question ?

Hors ligne