Bash和jq在json上嵌套循环

时间:2018-01-18 15:11:42

标签: json bash parsing jq

我尝试使用jq解析json文件并在bash脚本中使用它,但我遇到了一些困难。 json

[
{"annonce_id":"123","photos":["url_01"],"titre_slug":"slug1"},
{"annonce_id":"456","photos":["url_11","url_12"],"titre_slug":"slug2"},
{"annonce_id":"7890","photos":["url_31"],"titre_slug":"slug3"},
{"annonce_id":"1234","photos":["url_41"],"titre_slug":"slug4"},
{"annonce_id":"5678","photos":["url_51"],"titre_slug":"slug5"},
{"annonce_id":"90123","photos":["url_61"],"titre_slug":"slug6"}
]

目标: 对于每一行,检索bash变量中的annonce_id,titre_slug和照片。照片应该在一个数组中,因为它可以包含一个或多个元素。

如果我做了

jq -r '.[] | .annonce_id, .titre_slug, .photos'

关于这些数据,我显示了信息,但我希望在bash变量(最好以json字段命名)中使用它,使用annonce_id和titre_slug,并迭代照片。

由于

3 个答案:

答案 0 :(得分:1)

bash中有许多可能的解决方案。这是一个不需要mapfile(又名readarray)的人:

while read -r annonce
do      
    read -r titre
    IFS=$'\t' read -r -a photos
    echo annonce="$annonce"
    echo titre="$titre"
    echo number of photos is ${#photos[@]}
done < <(jq -r '.[] | .annonce_id, .titre_slug, (.photos | @tsv)' input.json)

答案 1 :(得分:-1)

将值存储在这样的变量中并处理它们

annonce_id=$(jq -r '.[] | .annonce_id')
titre_slug=$(jq -r '.[] | .titre_slug')
# more variables here

答案 2 :(得分:-2)

#!/bin/bash
    json_file="/home/pruebas/file.json"
    while read line
     do
        if [ $(echo $line|grep annonce|wc -l) -gt 0 ]
            then
                var_annonce_id=$(echo $line |grep annonce |awk 'BEGIN {FS="\""}{print $4}')
                var_titre_slug=$(echo $line |grep annonce |awk 'BEGIN {FS="\]"}{print $2}' | awk 'BEGIN {FS="\""}{print $4}')
                var_photo_array=$(echo $line |grep annonce |awk 'BEGIN {FS="\["}{print $2}' |awk 'BEGIN {FS="\]"}{print $1}' |tr -d "\"" | sed s/"\,"/" "/g )
                echo "Annonce_id=$var_annonce_id"
                echo "Titre_slug=$var_titre_slug"
                echo "Photo Array=$var_photo_array"
        fi
    done < $json_file