【问题标题】:Not able to get the desired output using jq无法使用 jq 获得所需的输出
【发布时间】:2021-05-12 00:19:03
【问题描述】:

我有一个如下的 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

【问题讨论】:

    标签: json csv export-to-csv jq


    【解决方案1】:

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

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

    jqplay.org查看它的实际应用

    【讨论】:

    • 这对我来说得到了想要的输出。我对变量概念不太熟悉。找到它并在这里申请
      cat shopping-items.json | jq -r '.grocery[] | .type 作为 $parent | .items[] | [$parent, .name, .quantity] |加入(“,”)'
    • 如果这个答案包含一个完整的工作示例,而不仅仅是对一个现在需要查找的概念的引用,那么它值得一票。
    • @Alfe - 查看 jqplay.org 链接。
    • @peak 我已经看到了。 SO 规则不仅要求链接到有答案的地方,而且要求答案中的内容完整。为了避免仅仅因为将来另一个网站出现故障而导致答案变得无用。
    • @Alfe - 如前所述,jq 程序已完成。该问题已经提供了完整的示例输入和示例输出,并表明 OP 知道如何调用 jq。所以在这里只是重复输入、输出和调用方式是多余的。
    猜你喜欢
    • 2015-04-06
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多