簡體   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