#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...
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
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 *
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.
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
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