如何使用shell脚本或jq命令将竖线分隔TXT转换为指定JSON格式
解决方案
方案一:纯jq命令实现(最简便)
首先确认你的系统已安装jq工具,直接执行以下命令即可完成转换:
jq -R -s ' split("\n") | map(select(length > 0) | split("|") as $f | { ProductId: $f[0], PIDT: $f[1], RPID: $f[2], OfferId: $f[3], Product1: [ { Action: $f[4] | ascii_upcase, ProductOfferId: $f[5] }, { Action: $f[6] | ascii_upcase, ProductOfferId: $f[7], RemoveProduct1Instance: $f[8] }, { Action: $f[9] | ascii_upcase, RemoveProduct1Instance: $f[10], ProductOfferId: $f[11] } ], Product2: [ { Action: $f[12] | ascii_upcase, NewComponentOfferId: $f[13] }, { Action: $f[14] | ascii_upcase, ComponentOfferId: $f[15], RemoveProduct2Instance: $f[16] }, { Action: $f[17] | ascii_upcase, RemoveProduct2Instance: $f[18], ProductOfferId: $f[19] } ] } ) ' data.txt > output.json
参数说明:
-R:按原始字符串读取每一行输入,不自动解析为JSON-s:将所有输入内容合并为单个字符串处理ascii_upcase:将原数据里的Return统一转为要求的大写RETURN格式select(length > 0):过滤掉文件末尾的空行,避免转换报错
方案二:Shell脚本实现(无需依赖jq,适配无jq环境)
如果你的环境无法安装jq,可以使用以下纯bash脚本实现:
#!/bin/bash output="[" first_line=1 while IFS='|' read -r pid pidt rpid offerid \ p1_add_act p1_add_id \ p1_remove_act p1_remove_id p1_remove_ins \ p1_return_act p1_return_ins p1_return_id \ p2_add_act p2_add_id \ p2_remove_act p2_remove_id p2_remove_ins \ p2_return_act p2_return_ins p2_return_id || [ -n "$pid" ]; do if [ $first_line -eq 0 ]; then output="$output," fi first_line=0 p1_add_act=$(echo "$p1_add_act" | tr '[:lower:]' '[:upper:]') p1_remove_act=$(echo "$p1_remove_act" | tr '[:lower:]' '[:upper:]') p1_return_act=$(echo "$p1_return_act" | tr '[:lower:]' '[:upper:]') p2_add_act=$(echo "$p2_add_act" | tr '[:lower:]' '[:upper:]') p2_remove_act=$(echo "$p2_remove_act" | tr '[:lower:]' '[:upper:]') p2_return_act=$(echo "$p2_return_act" | tr '[:lower:]' '[:upper:]') output="$output { \"ProductId\": \"$pid\", \"PIDT\": \"$pidt\", \"RPID\": \"$rpid\", \"OfferId\": \"$offerid\", \"Product1\": [ { \"Action\": \"$p1_add_act\", \"ProductOfferId\": \"$p1_add_id\" }, { \"Action\": \"$p1_remove_act\", \"ProductOfferId\": \"$p1_remove_id\", \"RemoveProduct1Instance\": \"$p1_remove_ins\" }, { \"Action\": \"$p1_return_act\", \"RemoveProduct1Instance\": \"$p1_return_ins\", \"ProductOfferId\": \"$p1_return_id\" } ], \"Product2\": [ { \"Action\": \"$p2_add_act\", \"NewComponentOfferId\": \"$p2_add_id\" }, { \"Action\": \"$p2_remove_act\", \"ComponentOfferId\": \"$p2_remove_id\", \"RemoveProduct2Instance\": \"$p2_remove_ins\" }, { \"Action\": \"$p2_return_act\", \"RemoveProduct2Instance\": \"$p2_return_ins\", \"ProductOfferId\": \"$p2_return_id\" } ] }" done < data.txt output="$output ]" echo "$output" > output.json
脚本使用说明:
- 给脚本添加执行权限:
chmod +x convert.sh - 执行脚本:
./convert.sh - 转换后的结果会保存在当前目录的
output.json文件中
注:你给出的目标JSON示例中
OfferId值20003为笔误,两个方案均按原数据实际取值(如第一条数据对应200003)处理,如果需要截断最后一位可自行修改取值逻辑。
内容的提问来源于stack exchange,提问作者Anynonym
相关产品推荐
相关产品推荐

