【问题标题】:Run the same jq pipeline on two files and compare the results?在两个文件上运行相同的 jq 管道并比较结果?
【发布时间】:2021-10-12 07:24:30
【问题描述】:

如果我在 schema.org repo data/release 目录中运行comm -23 <(jq -r '.["@graph"][] |.["rdfs:label"] ' 9.0/schemaorg-all-http.jsonld|sort) <(jq -r '.["@graph"][] | .["rdfs:label"] ' 13.0/schemaorg-all-http.jsonld|sort),那么它可以工作。另一方面,这很可怕。是否可以将其折叠为单个 jq 命令?

【问题讨论】:

    标签: jq


    【解决方案1】:

    不能说它不那么可怕,但是,完全可以在 JQ 中做到这一点。

    jq -nr '[inputs | [.["@graph"][]["rdfs:label"]]] | .[0]-.[1] | .[]' {9.0,13.0}/schemaorg-all-http.jsonld
    

    解释:

    给定两个文件,比如 x:

    [
    {"x": 1},
    {"x": 2}
    ]
    

    和你

    [
    {"x": 3},
    {"x": 4}
    ]
    

    jq -n 'inputs' x y 产生

    [
      {
        "x": 1
      },
      {
        "x": 2
      }
    ]
    [
      {
        "x": 3
      },
      {
        "x": 4
      }
    ]
    

    观察这只是两件事,一件接一件。我们最终会想要解决它们,所以我们将它包装在一个数组中。

    jq -n '[inputs]' x y

    [
      [
        {
          "x": 1
        },
        {
          "x": 2
        }
      ],
      [
        {
          "x": 3
        },
        {
          "x": 4
        }
      ]
    ]
    

    jq -n 的原因在Why does `inputs` skip the first line of the input file?

    一旦完成并理解了这一点,剩下的就相对容易了。

    1. .["@graph"] 提取 @graph 这是一个对象数组,
    2. [] 迭代所述数组
    3. ["rdfs:label"] 从每个对象中提取 ["rdfs:label"] 键。注意there's no dot before["rdfs:label"],这很奇怪。
    4. 我们知道inputs 只是输出输入文件,然后,回想一下它不是一个数组。管道运算符“如果左边的那个产生多个结果,那么右边的那个将为每个结果运行”所以inputs | .["@graph"][]["rdfs:label"] 将此提取应用于每个输入。
    5. 但是,最终结果仍然只是每个文件的多个结果,我们想要对其进行处理,因此我们需要将其收集到一个数组中。该手册介绍了数组构造[] 运算符“您可以使用它构造一个数组以将过滤器的所有结果“收集”到一个数组中(如[.items[].name])”这正是我们正在做的。除了我们没有像 .name 这样好的东西之外,我们有 ["rdfs:label"] 而是因为冒号,我们需要使用这种更冗长和更混乱的语法。我们现在有了inputs | [.["@graph"][]["rdfs:label"]],它将为每个输入文件输出一个数组。这些数组包含 rdfs:label 的值,并且具有与 @graph 拥有的对象相同数量的字符串。
    6. 现在应该熟悉的是,我们获取此输出并将其包装到一个数组中,以便稍后对其进行处理,因此我们到达[inputs | [.["@graph"][]["rdfs:label"]]]。运行每个步骤并观察输出是有帮助的。您将得到一个二维数组——外部维度是文件的数量,内部维度与前面的点一样,是与 @graph 拥有的对象相同的字符串数量。
    7. jq 的点表示“整个输入”,因此第一个运算符将获取此数组数组并获取其中的第一个和第二个元素并计算差值。
    8. 最后,我们不想输出这个数组,而是一个接一个地输出,这将允许-r 去掉引号。 .[] 表示遍历差异数组并输出每个元素。这与[] 数组构造函数的操作相反。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      相关资源
      最近更新 更多