You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jq的join函数未按预期工作,请求技术协助

问题:jq的join函数未得到预期结果

输入JSON数据

[
    [
        {
            "InstID": "i-049c7aa5976d78ab3",
            "Name": "dr-psoft-report01",
            "ImageID": "ami-09a868b800080436e",
            "Architecture": "x86_64",
            "OS": "Windows",
            "InstType": "z1d.large",
            "CpuCore": 1,
            "ThreadsPerCore": 2,
            "VolID": [
                "vol-07498f95efef04f85"
            ],
            "PrivIP": "10.77.132.218",
            "Status": "stopped"
        }
    ],
    [
        {
            "InstID": "i-05831bbd78bcfb9ac",
            "Name": "dr-psoft-web01",
            "ImageID": "ami-09a868b800080436e",
            "Architecture": "x86_64",
            "OS": "Windows",
            "InstType": "t3.xlarge",
            "CpuCore": 2,
            "ThreadsPerCore": 2,
            "VolID": [
                "vol-0b9390e079150ac1c",
                "vol-0cd2df67aa096af52",
                "vol-090c0d3290e1c4dad"
            ],
            "PrivIP": "10.77.132.170",
            "Status": "stopped"
        }
    ],
    [
        {
            "InstID": "i-0a6ef93417cc064eb",
            "Name": "dr-psoft-app01",
            "ImageID": "ami-09a868b800080436e",
            "Architecture": "x86_64",
            "OS": "Windows",
            "InstType": "z1d.xlarge",
            "CpuCore": 2,
            "ThreadsPerCore": 2,
            "VolID": [
                "vol-00a5285f92f18b9ee",
                "vol-0b979d1b578a1d672"
            ],
            "PrivIP": "10.77.132.139",
            "Status": "stopped"
        }
    ]
]

执行的jq命令

jq -r '.[] | .[] | [.InstID, .Name, .ImageID, .Architecture, .OS, .InstType, (.CpuCore|tostring), (.ThreadsPerCore|tostring), .PrivIP, .Status, ((.VolID[]|[.])|join(","))] | join("|")'

实际输出

i-049c7aa5976d78ab3|dr-psoft-report01|ami-09a868b800080436e|x86_64|Windows|z1d.large|1|2|10.77.132.218|stopped|vol-07498f95efef04f85
i-05831bbd78bcfb9ac|dr-psoft-web01|ami-09a868b800080436e|x86_64|Windows|t3.xlarge|2|2|10.77.132.170|stopped|vol-0b9390e079150ac1c|vol-0cd2df67aa096af52|vol-090c0d3290e1c4dad
i-0a6ef93417cc064eb|dr-psoft-app01|ami-09a868b800080436e|x86_64|Windows|z1d.xlarge|2|2|10.77.132.139|stopped|vol-00a5285f92f18b9ee|vol-0b979d1b578a1d672

预期输出

i-049c7aa5976d78ab3|dr-psoft-report01|ami-09a868b800080436e|x86_64|Windows|z1d.large|1|2|10.77.132.218|stopped|vol-07498f95efef04f85
i-05831bbd78bcfb9ac|dr-psoft-web01|ami-09a868b800080436e|x86_64|Windows|t3.xlarge|2|2|10.77.132.170|stopped|vol-0b9390e079150ac1c,vol-0cd2df67aa096af52,vol-090c0d3290e1c4dad
i-0a6ef93417cc064eb|dr-psoft-app01|ami-09a868b800080436e|x86_64|Windows|z1d.xlarge|2|2|10.77.132.139|stopped|vol-00a5285f92f18b9ee,vol-0b979d1b578a1d672

问题分析与解决方法

问题出在对VolID数组的处理逻辑上:原命令中(.VolID[]|[.])|join(",")会先遍历VolID的每个元素,把单个元素包装成数组后再执行join,这会导致每个元素都生成独立的字符串,最终这些字符串被当作外层数组的多个元素,所以用|分隔时就变成了多段字段。

正确的做法是直接对整个VolID数组执行join(","),无需遍历拆分元素。修正后的命令如下:

jq -r '.[] | .[] | [.InstID, .Name, .ImageID, .Architecture, .OS, .InstType, (.CpuCore|tostring), (.ThreadsPerCore|tostring), .PrivIP, .Status, (.VolID|join(","))] | join("|")'

这个命令会把VolID数组的所有元素用逗号连接成单个字符串,作为外层数组的一个元素,最终输出时就会成为|分隔的单个字段,完全符合预期。

内容的提问来源于stack exchange,提问作者Bijitesh Kundu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 03:24:58