从 JSON 文件中提取字段,将其与纯文本文件匹配值进行比较,并从 JSON 文件中提取特定字段
Posted
技术标签:
【中文标题】从 JSON 文件中提取字段,将其与纯文本文件匹配值进行比较,并从 JSON 文件中提取特定字段【英文标题】:To extract field from JSON file comparing it with plain text file matching values and extract specific field from JSON file 【发布时间】:2021-09-24 13:46:59 【问题描述】:我有file1.json
和纯文本file2
,如果使用file2
值与file.json
进行比较,匹配值为file2
会有相应的字段,即file1.json
中的CaseID@ 结果文件应该由这些值组成。我在下面提到了预期结果的案例。
我尝试使用 awk 工具进行提取,但没有得到预期的答案
awk -F, 'FNR==NR f2[$1];next !($0 in f2)' file2 file1
file1.json
"Cases": [
"CaseID": "100",
"CaseUpdatedByUser": "XYZ",
"Case":
"CaseName": "Apple",
"ID": "1"
,
"CaseID": "350",
"CaseUpdatedByUser": "ABC",
"Case":
"CaseName": "Mango",
"ID": "1"
,
"CaseID": "440",
"CaseUpdatedByUser": "PQR",
"Case":
"CaseName": "Strawberry",
"ID": "1"
]
文件2
Apple
Strawberry
Mango
预期输出:
100
350
440
【问题讨论】:
这可能会有所帮助:jq -r '.Cases[] | "\(.Case.CaseName);\(.CaseID)"' file1
@Cyrus 我的系统配置了自定义repo,所以无法下载jq
@Cyrus 是将值与 file2 进行比较的命令。我在命令中看不到有关 file2 的任何信息
没有。正确的。但这使得使用awk
处理输出变得更容易。
@Cyrus 不知何故我设法使用jq
提取结果.. 这个结果我使用awk
但它会导致最后一个参数的文件内容被传递.. jq -r '.Cases[] | "\(.Case.CaseName);\(.CaseID)"' file1 >> f1
我将结果重定向到 f1 文件的 f1 内容~~~ Apple;100 Mango;350 Strawberry;440 ~~~ 现在如果使用 awk ``` awk -F, 'FNR==NR f2[$1];next ! ($0 in f2)' file2 f1```会变成f1的内容
【参考方案1】:
如果您编写一个extract.py
模块来帮助您获得所需的确切信息,怎么样。
模块很灵活,可以作为模块导入到任何项目中。
我尝试了一个复杂而长的 json 文件,它工作得很好。
这个模块的代码是:
#extract.py
def json_extract(obj, key):
arr = []
def extract(obj, arr, key):
if isinstance(obj, dict):
for k, v in obj.items():
if isinstance(v, (dict, list)):
extract(v, arr, key)
elif k == key:
arr.append(v)
elif isinstance(obj, list):
for item in obj:
extract(item, arr, key)
return arr
values = extract(obj, arr, key)
return values
为了进一步解释,这是原帖的URL (Extract Nested Data From Complex JSON)。
【讨论】:
【参考方案2】:使用jq
、awk
和sort
:
jq -r '.Cases[] | "\(.Case.CaseName);\(.CaseID)"' file1 \
| awk -F ';' 'NR==FNRarray[$1]=$2; next print array[$1]' - file2 \
| sort -n
输出:
100 350 440【讨论】:
以上是关于从 JSON 文件中提取字段,将其与纯文本文件匹配值进行比较,并从 JSON 文件中提取特定字段的主要内容,如果未能解决你的问题,请参考以下文章
从特定 JSON 字段中提取数据,将其用作变量,并更新字段值?