如何从JSON文件嵌套字段提取指定字段并分文件存储?
首先,先纠正你之前的curl命令问题:你原来的命令curl "https://example.com/public?command=getInfo" > test | python -m json.tool > test是有问题的——> test会直接把curl的输出写入文件,导致后面的python -m json.tool没有输入可以处理。正确的写法应该是先让curl的输出通过管道传给json.tool格式化,再写入test:
curl "https://example.com/public?command=getInfo" | python -m json.tool > test
接下来,针对你提取指定字段并写入对应文件的需求,我分两种方法给你解决:
方法1:用jq(推荐,专门处理JSON的工具)
jq是处理JSON数据的专业工具,比awk更可靠,语法也更直观,能避免文本处理JSON时的各种边缘问题。
生成test2(保存A_B和A_C的Field2):
jq -r '["A_B", "A_C"][] as $key | "\($key): \(.[$key].Field2)"' test > test2
生成test3(保存A_B和A_C的Field5):
jq -r '["A_B", "A_C"][] as $key | "\($key): \(.[$key].Field5)"' test > test3
简单解释:
-r参数让jq输出不带引号的原始字符串["A_B", "A_C"][]用来遍历你需要的两个键\($key): \(.[$key].Field2)直接拼接成你想要的键: 值格式
方法2:用AWK实现(符合你的尝试方向)
因为JSON是结构化数据,awk默认的文本处理逻辑需要针对格式化后的JSON结构做调整。你之前的命令失败,是因为A_B的定义和Field2/Field5不在同一行,且分隔符设置没有匹配JSON的格式。下面是可行的awk命令:
awk ' # 标记当前处于哪个数据块 /A_B/{in_ab=1; in_ac=0} /A_C/{in_ac=1; in_ab=0} # 在A_B块中提取Field2和Field5 in_ab && /Field2/{ split($0, arr, /"|: |,/) # 用双引号、冒号+空格、逗号作为分隔符拆分行 print "A_B: " arr[4] > "test2" } in_ab && /Field5/{ split($0, arr, /"|: |,/) print "A_B: " arr[4] > "test3" } # 在A_C块中提取Field2和Field5 in_ac && /Field2/{ split($0, arr, /"|: |,/) print "A_C: " arr[4] > "test2" } in_ac && /Field5/{ split($0, arr, /"|: |,/) print "A_C: " arr[4] > "test3" } ' test
逻辑说明:
- 先通过匹配
A_B和A_C的行,标记当前处于哪个数据块 - 在对应块中匹配
Field2或Field5的行,用split拆分该行,取出对应的值 - 把格式化后的内容写入对应的test2或test3文件
执行这个命令后,就能得到你想要的文件内容。
内容的提问来源于stack exchange,提问作者user12865483
相关产品推荐
相关产品推荐

