You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:54:05