如何使用JQ命令将竖线分隔文本转换为指定结构的JSON
实现方案
前置说明
先给出示例输入对齐逻辑,可根据你实际的产品字段格式调整拆分规则:
# 输入文件input.txt样例,分隔符为| ext_id_001|CUST_ID|RPPI_001|OFFER_001|Samsung:ADD:Galaxy S24 Ultra|Apple:REMOVE:iPhone 14 Pro ext_id_002|DEVICE_ID|RPPI_002|OFFER_002|Apple:ADD:iPhone 15 Pro ext_id_003|ACCT_ID|RPPI_003|OFFER_003|Samsung:REMOVE:Galaxy S23
默认输出的JSON结构为:
- 包含4个固定顶层字段
- 新增
product_operations数组,每个元素对应一个产品操作,包含product_brand、action、product_model三个字段
如果你的目标结构不一样,可自行调整jq里的字段构造逻辑。
方案1:单条jq命令实现(推荐,性能更高)
直接用jq处理原生文本,无需额外依赖:
jq -R -F '|' ' # 跳过空行 select(length > 0) # 提取前4个固定字段 | { ExternalId: .[0], ExternalIdType: .[1], RPPI: .[2], NewPrimaryOfferId: .[3], product_operations: [ # 遍历第5位开始的所有产品操作字段 .[4:][] # 按:拆分单个操作的三个字段 | split(":") | { product_brand: .[0], action: .[1], product_model: .[2] } ] } ' input.txt
如果需要输出单个数组包裹所有结果,可在命令最后加-s参数。
方案2:Shell脚本实现(适合需要加自定义校验逻辑的场景)
#!/bin/bash INPUT_FILE="input.txt" OUTPUT_FILE="output.json" # 初始化JSON数组 echo "[" > "$OUTPUT_FILE" FIRST_LINE=1 # 逐行读取文件 while IFS='|' read -r ext_id ext_id_type rppi new_offer_id rest; do # 跳过空行 [ -z "$ext_id" ] && continue [ $FIRST_LINE -eq 0 ] && echo "," >> "$OUTPUT_FILE" FIRST_LINE=0 # 处理后续产品操作字段 ops_json=$(echo "$rest" | tr '|' '\n' | jq -R -s ' split("\n") | map(select(length>0) | split(":") | {product_brand: .[0], action: .[1], product_model: .[2]}) ') # 构造单行JSON jq -n \ --arg eid "$ext_id" \ --arg eid_type "$ext_id_type" \ --arg rppi "$rppi" \ --arg offer "$new_offer_id" \ --argjson ops "$ops_json" \ '{ExternalId: $eid, ExternalIdType: $eid_type, RPPI: $rppi, NewPrimaryOfferId: $offer, product_operations: $ops}' >> "$OUTPUT_FILE" done < "$INPUT_FILE" echo "]" >> "$OUTPUT_FILE"
脚本执行后会生成格式化后的完整JSON数组文件output.json。
输出样例
对应上面的输入样例,输出结果如下:
[ { "ExternalId": "ext_id_001", "ExternalIdType": "CUST_ID", "RPPI": "RPPI_001", "NewPrimaryOfferId": "OFFER_001", "product_operations": [ { "product_brand": "Samsung", "action": "ADD", "product_model": "Galaxy S24 Ultra" }, { "product_brand": "Apple", "action": "REMOVE", "product_model": "iPhone 14 Pro" } ] }, { "ExternalId": "ext_id_002", "ExternalIdType": "DEVICE_ID", "RPPI": "RPPI_002", "NewPrimaryOfferId": "OFFER_002", "product_operations": [ { "product_brand": "Apple", "action": "ADD", "product_model": "iPhone 15 Pro" } ] }, { "ExternalId": "ext_id_003", "ExternalIdType": "ACCT_ID", "RPPI": "RPPI_003", "NewPrimaryOfferId": "OFFER_003", "product_operations": [ { "product_brand": "Samsung", "action": "REMOVE", "product_model": "Galaxy S23" } ] } ]
内容的提问来源于stack exchange,提问作者Anynonym
相关产品推荐
相关产品推荐

