程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了基于相似的ID对象合并jq中的文件和改造数据大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决基于相似的ID对象合并jq中的文件和改造数据?

开发过程中遇到基于相似的ID对象合并jq中的文件和改造数据的问题如何解决?下面主要结合日常开发的经验,给出你关于基于相似的ID对象合并jq中的文件和改造数据的解决方法建议,希望对你解决基于相似的ID对象合并jq中的文件和改造数据有所启发或帮助;

前言:如果 jq 无法实现以下功能,那么我完全接受它作为答案,并将尝试使用 bash 强制执行此操作。

我有两个包含一些 ID 的文件,通过一些按摩,这些 ID 应该能够合并为一个文件。我也会添加一些内容(如输出所示)。本质上,“MItre_test”应该与“sys_id”进行比较。相比之下,in2.Json 中的“MItrEID”变成了输出中的 technology_ID(通常是每个输出对象的统一字段)。

注意事项:

  1. 在 in1.Json 中放置了一些垃圾“desc”值,以确保尽可能编程,并且我正在使用的真实输入文件中实际上有许多垃圾输入。

  2. 一些 mitre_test 值是成对的,不在一个真正的数组中。我可以将它们拆分并分解,但发现自己丢失了 in1.Json 中的其他信息。

  3. 注意输出的“元数据”中包含来自 in1.Json 的“数字”值,并以一种奇怪的方式(但接收工具需要的方式)存储。

in1.Json

[
{
  "test": "Execution","mitrEID": "T1204.001","mitre_test": "90b"
},{
  "test": "Defense Evasion","mitrEID": "T1070.001","mitre_test": "afa"
},{
  "test": "Credential Access","mitrEID": "T1556.004","mitre_test": "14b"
},{
  "test": "Initial Access","mitrEID": "T1200","mitre_test": "f22"
},{
  "test": "Impact","mitrEID": "T1489","mitre_test": "fa2"
}
]

in2.Json

[
  {
    "number": "REL0001346","desc": "apple","mitre_test": "afa"
  },{
    "number": "REL0001343","desc": "pear","mitre_test": "90b"
  },{
    "number": "REL0001366","desc": "orange","mitre_test": "14b,f22"
  },{
    "number": "REL0001378","desc": "pineapple","mitre_test": "90b"
  }
]

输出:

[{
  "techniquEID": "T1070.001","tactic": "defense-evasion","score": 1,"color": "","comment": "","enabled": true,"Metadata": [{
      "name": "DET_ID","value": "REL0001346"
    }],"showSubtechniques": true
},{
  "techniquEID": "T1204.001","tactic": "execution","value": "REL0001343"
    },{
      "name": "DET_ID","value": "REL0001378"
    }],{
  "techniquEID": "T1556.004","tactic": "credential-access","value": "REL0001366"
    }],{
  "techniquEID": "T1200","tactic": "initial-access","showSubtechniques": true
}
]

我假设我在 mitre_test 上使用 .mitre_test |= split(",")) 之类的东西进行了一些拆分,并且我假设有一些连接,但这样做会导致数据丢失或数据混淆。您会注意到输出中的静态数据也存在,但很可能很容易放入,因此问题不大。

编辑:减少了一些匹配 ID,以便在分析 in1 和 in2 文件时更容易查看。还简化了两个输入以具有类似的结构,以便稍后更容易理解答案。

解决方法

要求有点不透明,但很明显,如果任务可以由计算机完成,则可以使用 jq 完成。

从描述看来,问题的一个不寻常方面是 in1.json 定义的“字典”必须通过拆分 CSV(逗号分隔值)的键名来派生。因此,这是一个可以做到这一点的 jq def:

# Input: a JSON Dictionary for which some keys are CSV,# Output: a JSON Dictionary with the CSV keys split on the commas
def refine:
  . as $in
  | reduce keys_unsorted[] as $k ({};
    if ($k|index(","))
    then ($k/",") as $keys
    | . + ($keys | map( {(.): $in[$k]}) | add)
    else .[$k] = $in[$k]
    end );

您可以通过运行来查看它是如何工作的:

INDEX($mitre.records[]; .mitre_test) | refine

使用 jq 的调用,例如:

jq --argfile mitre in1.json -f program.jq in2.json

对于问题的加入部分,有很多关于SO的相关问答,例如

How to join JSON objects on particular fields using jq?

,

可能有一种更优雅的方法来做到这一点,但我最终手动遍历事物并管道到新的输出。

说明: 读入两个文件,提取我需要的字段。

用 map 和 try 将以前只是逗号分隔的一组值的 mitre_test 值分开。

将不变的字段存储为变量,然后操纵 mitre_test 成为适当拆分的数组,删除空值。 按 mitre_test 值分组,因为它们是输出所基于的通用内容。

清除更多空值。

对输出进行排序,使其看起来像我想要的。

jq . in1.json in2.json | \
jq '.[] |{number: .number,test: .test,mitrEID: .mitrEID,mitre_test: .mitre_test}'  |\
jq -s '[. |map(try(.mitre_test |= split(",")) // .)|\
.[] | [.number,.test,.mitrEID] as $h | .mitre_test[] |$h + [.] | \
{DET_ID: .[0],tactic: .[1],techniquEID: .[2],mitre_test: .[3]}] |\
del(.[][] | nulls)' |jq '[group_by(.mitre_test)[]|{mitre_test: .[0].mitre_test,techniquEID: [.[].techniquEID],tactic: [.[].tactic],DET_ID: [.[].DET_ID]}]|\
del(.[].techniquEID[] | nulls) | del(.[].tactic[] | nulls) | del(.[].DET_ID[] | nulls)' | \
jq '.[]| [{techniquEID: .techniquEID[0],tactic: .tactic[0],metadata: [{name: "DET_ID",value: .DET_ID[]}]}] | .[] | \
SELEct((.metadata|length)>0)'

这是一条很长的线,所以我把它分成了一些基本的想法。

大佬总结

以上是大佬教程为你收集整理的基于相似的ID对象合并jq中的文件和改造数据全部内容,希望文章能够帮你解决基于相似的ID对象合并jq中的文件和改造数据所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: