使用jq

时间:2019-03-16 06:36:35

标签: shell jq

根据该部分,我正在尝试解析我的数据并将其转换为多个 csv 文件。

示例JSON

{
    "content": [
    {
        "Title": "abc",
        "brand": "xyz",
        "size": "5 g",
        "date": "2019-01-01",
        "details": {
            "Temperature": [
            {
                "value": "90",
                "chracterstics":"Normal"
            },
            {
                "value":"100",
                "chracterstics":"high"
            },

            {
                "value":"80",
                "chracterstics":"low"
            }
            ],

            "certifications": [
            {
                "value": "based",
                "chracterstics":"pass"
            },

            {
                "value": "50",
                "chracterstics":"failed"
            }
            ]
        },

         "formats": {
            "city": "NYC",
            "id": "007",
            "manufacture":""
            },
        "innerDetails": [
        {
            "contains": "abc",
            "panel":"xyz",
            "values":[
                {
                    "name":"abc",
                    "value":"10"
                },
                {
                    "name":"xyz",
                    "value":"20"
                }
                ]
            }
        ]
}
]
}

我正在尝试将内容数据放入一个 csv 文件中,将温度数据放入第二个 csv 文件中,将证书放入第三个文件中,将格式和内部详细信息数据放入另一个单独的文件中

我尝试了以下方法,但是出现“无法使用字符串“ brand”索引数组”错误。

jq -r '.[]|[.Title,.brand,.size,.date]|@csv' $jsonfile > sample.csv.

我尝试与其他部分在同一行上,但是遇到相同的错误。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

使用地图:

$jq -r '.[] | map(.Title), map(.brand), map(.size), map(.date) | @csv' yourfile.json > sample.csv

答案 1 :(得分:0)

为简单起见,最好在单独的jq调用中处理每组数据。 鉴于jq的每次调用都非常快,因此这似乎是合理的,而且似乎只需要少量此类调用即可。

温度和认证数据在JSON输入中是统一的,因此可以在诸如以下的循环中处理:

for field in Temperature certifications ; do
    echo $field ::
    jq --arg field "$field" -r '
      .content[].details | .[$field][]
      | [.value, .characteristics] | @csv' input.json > output.$field.csv
done    

(当然,这假定JSON有效,并且“证明”的拼写正确。)

添加“内容”特定的列

for field in Temperature certifications ; do
    echo $field ::
    jq --arg field "$field" -r '.content[]
      | [.Title, .brand] as $columns
      | .details | .[$field][]
      | ($columns + [.value, .characteristics]) | @csv
    ' so-multiple-csv-files.json > tmp.output.$field.csv
done