如何使用jq在JSON转CSV过程中去除重复address属性与重复JSON数组
你的命令为啥会重复输出表头和数据呢?因为jq默认是逐个处理输入里的每个JSON实体的——你提供的输入包含两个完全独立的JSON数组,所以原命令会分别对每个数组执行一次完整的处理流程,结果就导致表头和数据都输出了两遍。
要解决这个问题,核心是先把所有输入的JSON数组合并成一个统一的数据集,再进行去重和CSV转换。这里可以用jq的-s(slurp)选项和flatten函数来实现:
修正后的命令
jq -r -s '["Name","Address","Status"], (flatten | unique_by(.address)[] | [.name, .address, .status]) | @csv' sample.json > sample.csv
命令拆解
咱们一步步看这个命令的作用:
-s选项:把输入中的所有JSON结构(这里是两个数组)合并成一个顶级数组,变成[[对象1, 对象2,...], [对象1, 对象2,...]]的嵌套形式。flatten函数:把这个嵌套的二维数组展开成一维数组,这样就得到了包含10个元素的列表(原始的5个对象各重复一次)。unique_by(.address):按照address属性对所有元素去重,保留每个地址第一次出现的条目(比如Kolkata对应的第一个条目是Ram的记录)。- 最后生成表头和对应的CSV行,整个流程只执行一次,所以表头和数据都只会输出一遍。
预期输出
执行这个命令后,你会得到完全符合需求的结果:
"Name","Address","Status" "Ram","Kolkata","active" "Kishore","Hyderabad","active" "Manu","Kerala","active" "Adam","Bangalore","inactive"
(注:行的顺序可能会因jq内部处理逻辑略有差异,但内容和去重效果完全满足你的要求)
内容的提问来源于stack exchange,提问作者gamer_rulez
相关产品推荐
相关产品推荐

