【问题标题】:Extract fields from object present in multiple nested levels using jq使用 jq 从存在于多个嵌套级别的对象中提取字段
【发布时间】:2020-07-17 06:23:10
【问题描述】:

我有一个文本文件,其数据记录如下:

{"input":{"payload":{"id":"rec1","var2":"imp_val1","var3":"","var4":"000000"},"recordName":"typeABC"}}
{"input":{"recordName":"typeBCD","payload":{"var5":"val_var66","recordType":"typeA","id":"rec2","var2":"imp_val2","var3":"","var4":"000000"}}}
{"recordName":"typeEFG","payload":{"var5":"val_var55","recordType":"typeA","id":"rec3","var2":"imp_val3","var3":"","var4":""}}
{"payload":{"id":"rec4","var2":"imp_val4","var3":"","var4":"000000"},"recordName":"typeABC"}

有一个记录名称和有效负载键,其中包含我感兴趣的值。一些记录被包装在另一个键输入中。 我要从所有这些记录中提取 id 和 var2 到一个新的 csv 文件中。

我想如果数据格式是统一的,我可以这样做:

cat file | jq -r "[.payload.id, .payload.var2] | @csv" > newFile

cat file | jq -r "[.input.payload.id, .input.payload.var2] | @csv" > newFile

任何指针?

【问题讨论】:

    标签: json jq


    【解决方案1】:

    由于payload对象嵌套在每个对象的多个级别中,您可以应用Recursive Descent ..,如果键不存在则忽略

    jq -r '..| .payload? // empty | [ .id, .var2 ] | @csv' file
    

    jqplay - Online demo

    【讨论】:

      【解决方案2】:

      顺便说一句,我也想出了以下作品:

      jq -r 'if .input then .input.payload else .payload end | [.id, .var2] | @csv' file > newFile
      

      【讨论】:

      • 如果我 cat 文件然后管道 jq 命令会有性能差异吗?
      • {"input":1} 之类的对象上运行此操作会出错。
      • 感谢您的评论。我同意。对于我的具体情况,我知道“有效载荷”将永远存在,因此我的答案。
      • 下次在问题中包含这些细节,这样我们就不必猜测了。
      猜你喜欢
      • 2022-11-24
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多