使用Unix命令与jq提取JSON中匹配后四位规则的关联ID
实现方案
前提说明
我们预设两类输入的格式如下,你可以根据实际格式调整字段分隔符参数:
- jq提取后输出的关联ID文件(示例命名
customer_rel_ids.txt):每行格式为[客户ID] [关联ID1] [关联ID2] ... [关联IDn],默认空格分隔 - 待匹配列表文件(示例命名
match_list.txt):每行格式为[客户ID] [待匹配关联ID后四位],默认空格分隔
方案1:基于已提取的文本文件过滤(awk实现)
直接用awk做双文件匹配处理,无需额外依赖:
awk ' # 第一步:加载匹配列表,生成客户ID到待匹配后缀集合的映射 NR == FNR { match_map[$1][$2] = 1 next } # 第二步:遍历客户关联ID文件做匹配输出 { cust_id = $1 # 遍历当前客户的所有关联ID for (i=2; i<=NF; i++) { rel_id = $i # 取关联ID最后四位,长度不足4位时直接取完整ID suffix = length(rel_id) >= 4 ? substr(rel_id, length(rel_id)-3) : rel_id # 匹配成功则输出结果 if (match_map[cust_id][suffix] == 1) { print cust_id, rel_id } } } ' match_list.txt customer_rel_ids.txt
示例验证
假设match_list.txt内容:
1001 5678 1002 9012
假设customer_rel_ids.txt内容:
1001 abc1234 def5678 ghi9012 1002 xyz3456 uvw9012
运行命令后输出结果:
1001 def5678 1002 uvw9012
方案2:直接从原始JSON流式处理(jq+awk组合)
不需要生成中间的关联ID文本文件,直接把API请求的结果通过管道处理:
# 替换为你实际调用API的命令(比如curl地址、认证参数等) curl <你的API请求地址> | \ # 替换为你实际的jq提取逻辑,输出格式为 客户ID+空格分隔的所有关联ID jq -r '.[] | "\(.customer_id) \(.related_ids | join(" "))"' | \ # awk从标准输入读取jq输出做匹配 awk ' NR == FNR { match_map[$1][$2] = 1; next } { cust_id = $1 for (i=2; i<=NF; i++) { suffix = length($i) >=4 ? substr($i, length($i)-3) : $i if (match_map[cust_id][suffix]) print cust_id, $i } } ' match_list.txt -
- 若字段分隔符为制表符,给awk加上
-F'\t'参数即可适配。
内容的提问来源于stack exchange,提问作者Sammy
相关产品推荐
相关产品推荐

