Windows命令行下使用jq拆分JSON数组元素并按制表符分列的方法
问题描述
我是jq的新手,正在Windows命令行中使用它。需要将输入JSON中的数组拆分为多行,再将数组中的每个元素按制表符(\t)分割为列,同时处理第一个元素的字符串截取(比如"001-CARDIO-GRAN"要提取出"GRAN")。
输入JSON:
{ "ProcessId": "5452", "TotalRows": 226171, "Rows": [ "001-CARDIO-GRAN\t1052", "01_MO_FIN\t1148", "02_MO_S_PACK\t1148" ] }
期望输出:
GRAN,1052 01_MO_FIN,1148 02_MO_S_PACK,1148
我尝试了命令:
jq-win32 "last(.[])" output.json
得到的结果是:
GRAN\t1052", "01_MO_FIN\t1148", "02_MO_S_PACK\t1148",
请问如何进一步通过管道操作完成拆分以实现需求?
解决方案
直接用jq就能完成所有处理,不需要额外管道,命令如下:
jq-win32 -r '.Rows[] | split("\t") | (.[0] | if test("-") then split("-")[-1] else . end) + "," + .[1]' output.json
命令拆解:
-r:输出原始字符串,不会带JSON格式的引号.Rows[]:遍历Rows数组里的每一个元素split("\t"):把每个元素按制表符拆分成子数组(比如"001-CARDIO-GRAN\t1052"会变成["001-CARDIO-GRAN", "1052"])(.[0] | if test("-") then split("-")[-1] else . end):处理子数组的第一个元素,如果包含-就取最后一段,否则保持原样+ "," + .[1]:把处理后的第一个元素和第二个元素用逗号拼接成最终字符串
如果一定要结合管道用Windows工具辅助处理,也可以用PowerShell配合,但效率不如纯jq:
jq-win32 -r '.Rows[]' output.json | powershell -Command "$input | ForEach-Object { $parts = $_ -split '\t'; if ($parts[0] -match '-') { $val = $parts[0].Split('-')[-1] } else { $val = $parts[0] }; \"$val,$($parts[1])\" }"
内容的提问来源于stack exchange,提问作者Raghav Krishna
相关产品推荐
相关产品推荐

