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
相关产品推荐
相关产品推荐

