shell 脚本解析JSON,并按照指定格式输出到另一文件

文章介绍了如何在Linux环境下安装jq工具,然后使用该工具解析包含多条JSON数据的文件,提取特定字段并转换为CSV格式。通过示例展示了如何编写Shell脚本来读取每行JSON数据,提取COLUMNINFO对象中的字段,并将结果追加到CSV文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一步需要安装jq

按照命令顺序执行即可,安装Jq

wget https://github.com/stedolan/jq/releases/download/jq-1.5/jq-1.5.tar.gz
tar zxvf jq-1.5.tar.gz
cd jq-1.5
./configure && make && make install

判断是否安装完成

echo '{"name":"bob","age":"20"}' | jq '.name'

在这里插入图片描述

第二步查看JSON格式

去获取json格式中的 COLUMNINFO 对象里面的值。

{
	"OWNER": "AHWNCC",
	"objnNo": "77201",
	"OP": "I",
	"TABLE": "AC_CONTRACTADD_INFO",
	"OP_SCN": "53157161",
	"OP_TIME": "2023-06-21 11:35:59",
	"LOADERTIME": "2023-06-21 11:36:00",
	"TRANS_ID": "0",
	"ORA_ROWID": "AAAS2RAA2AAH5R+AAg",
	"SEQ_ID": "0",
	"COLUMNINFO": {
		"BUSI_TYPE": "null",
		"CONTRACT_NO": "10000030299086",
		"FIELD_CODE": "11000090",
		"FIELD_ORDER": "0",
		"FIELD_VALUE": "2",
		"FINISH_FLAG": "N",
		"LOGIN_ACCEPT": "64431319552",
		"LOGIN_NO": "USypWZSBm",
		"OP_CODE": "3901",
		"OP_TIME": "1985-06-19 20:26:01",
		"OTHER_VALUE": "帐户属性类型附加"
	},
	"PK": {
		"CONTRACT_NO": "10000030299086",
		"FIELD_CODE": "11000090"
	}
} 
{
	"OWNER": "AHWNCC",
	"objnNo": "77201",
	"OP": "I",
	"TABLE": "AC_CONTRACTADD_INFO",
	"OP_SCN": "53157161",
	"OP_TIME": "2023-06-21 11:35:59",
	"LOADERTIME": "2023-06-21 11:36:00",
	"TRANS_ID": "0",
	"ORA_ROWID": "AAAS2RAA2AAH5R0AAP",
	"SEQ_ID": "0",
	"COLUMNINFO": {
		"BUSI_TYPE": "null",
		"CONTRACT_NO": "10000030299122",
		"FIELD_CODE": "11000090",
		"FIELD_ORDER": "1",
		"FIELD_VALUE": "1",
		"FINISH_FLAG": "Y",
		"LOGIN_ACCEPT": "164644456",
		"LOGIN_NO": "Zgof",
		"OP_CODE": "0000",
		"OP_TIME": "1998-08-15 18:02:12",
		"OTHER_VALUE": "系统刷新"
	},
	"PK": {
		"CONTRACT_NO": "10000030299122",
		"FIELD_CODE": "11000090"
	}
}

注意,我这边文件,一个json串是只有一行,因为一行所以可以直接用读取文件的每一行来进行shell脚本的编写。
在这里插入图片描述

第三步输出shell脚本

#!/bin/bash
# 将json 数据 解析成 csv文件
while read -r line; do
# jq -r 是英文字符串输出出来会有双引号,-r 可以消除
# 用jq 插件的对象的方式去获取
    BUSI_TYPE=$(echo $line | jq -r '.COLUMNINFO.BUSI_TYPE')
    CONTRACT_NO=$(echo $line | jq -r '.COLUMNINFO.CONTRACT_NO')
    FIELD_CODE=$(echo $line | jq -r '.COLUMNINFO.FIELD_CODE')
    FIELD_ORDER=$(echo $line | jq -r '.COLUMNINFO.FIELD_ORDER')
    FIELD_VALUE=$(echo $line | jq -r '.COLUMNINFO.FIELD_VALUE')
    FINISH_FLAG=$(echo $line | jq -r '.COLUMNINFO.FINISH_FLAG')
    LOGIN_ACCEPT=$(echo $line | jq -r '.COLUMNINFO.LOGIN_ACCEPT')
    LOGIN_NO=$(echo $line | jq -r '.COLUMNINFO.LOGIN_NO')
    OP_CODE=$(echo $line | jq -r '.COLUMNINFO.OP_CODE')
    OP_TIME=$(echo $line | jq -r '.COLUMNINFO.OP_TIME')
    OTHER_VALUE=$(echo $line | jq -r '.COLUMNINFO.OTHER_VALUE')
# 输出文件的拼接
    data_txt=${BUSI_TYPE},${CONTRACT_NO},${FIELD_CODE},${FIELD_ORDER},${FIELD_VALUE},${FINISH_FLAG},${LOGIN_ACCEPT},${LOGIN_NO},${OP_CODE},${OP_TIME},${OTHER_VALUE}
    # 注意要用>> 这个是追加。 不要用 > 这个是覆盖,会导致每一行都会被覆盖只剩最后一行输出 
    echo $data_txt >> 'AC_CONTRACTADD_INFO_JSON.csv'
done <AC_CONTRACTADD_INFO.csv

结果展示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值