繁体   English   中英

无法使用 jq 获得所需的 output

[英]Not able to get the desired output using jq

我有一个 json 文件,如下所示: shopping-items.json

{
  "grocery" : [
    {
      "type": "fruits",
      "items" : [
        { "name": "mango", "quantity": "1kg" },
        { "name": "kiwi", "quantity": "2pc" },
        { "name": "apple", "quantity": "2kg" },
        { "name": "banana", "quantity": "6pc" }
      ]
    },
    {
      "type": "vegetables",
      "items" : [
        { "name": "potato", "quantity": "3kg" },
        { "name": "onion", "quantity": "2kg" },
        { "name": "tomato", "quantity": "2kg" }
      ]
    },
    {
      "type": "dryfruits",
      "items" : [
        { "name": "almonds", "quantity": "2kg" },
        { "name": "cachewnut", "quantity": "1kg" },
        { "name": "walnut", "quantity": "1.5kg" }
      ]
    },
    {
      "type": "pulses",
      "items" : [
        { "name": "Blackgram", "quantity": "1kg" },
        { "name": "chickpeas", "quantity": "2kg" },
        { "name": "lentils", "quantity": "1.5kg" }
      ]
    }
  ]
}

我在这个集合上尝试了几个 jq 查询:-

$ cat shopping-items.json | jq -r '.grocery[] | .items[] | [.name, .quantity]  | join (",")'
mango,1kg
kiwi,2pc
apple,2kg
banana,6pc
potato,3kg
onion,2kg
tomato,2kg
almonds,2kg
cachewnut,1kg
walnut,1.5kg
Blackgram,1kg
chickpeas,2kg
lentils,1.5kg
$ cat shopping-items.json | jq -r '.grocery[] | [.type, .items[].name, .items[].quantity] | join (",")'
fruits,mango,kiwi,apple,banana,1kg,2pc,2kg,6pc
vegetables,potato,onion,tomato,3kg,2kg,2kg
dryfruits,almonds,cachewnut,walnut,2kg,1kg,1.5kg
pulses,Blackgram,chickpeas,lentils,1kg,2kg,1.5kg

但期望的结果如下:-

fruits,mango,1kg
fruits,kiwi,2pc
fruits,apple,2kg
fruits,banana,6pc
vegetables,potato,3kg
vegetables,onion,2kg
vegetables,tomato,2kg
dryfruits,almonds,2kg
dryfruits,cachewnut,1kg
dryfruits,walnut,1.5kg
pulses,Blackgram,1kg
pulses,chickpeas,2kg
pulses,lentils,1.5kg

有办法,但我觉得效率不高。 为这个结果寻找一种有效的方法。

filename=shopping-items.json
count=`cat ${filename} | jq -c '.grocery[] | keys' | wc -l`
counter=0
while [ $counter -lt $count ]
do
  var_type=`cat ${filename} | jq -r .grocery[$counter].type`
  jq --arg var_type $var_type --argjson c $counter --raw-output '.grocery[$c].items[] | [$var_type, .name, .quantity] | join(",")' ${filename}
  counter=`expr $counter + 1`
done

为了达到预期的效果,您可以使用以下 jq 程序简单地调用 jq 一次:

.grocery[]
| [.type] + ( .items[] | [.name, .quantity])
| join (",")

jqplay.org上查看它的实际应用

jqplay.org

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM