【问题标题】:To extract field from JSON file comparing it with plain text file matching values and extract specific field from JSON file从 JSON 文件中提取字段,将其与纯文本文件匹配值进行比较,并从 JSON 文件中提取特定字段
【发布时间】: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的内容

标签: json awk sed file-comparison


【解决方案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】:

    使用jqawksort

    jq -r '.Cases[] | "\(.Case.CaseName);\(.CaseID)"' file1 \
      | awk -F ';' 'NR==FNR{array[$1]=$2; next} {print array[$1]}' - file2 \
      | sort -n
    

    输出:

    100 350 440

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 2021-12-30
      • 2022-10-17
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多