【问题标题】:Why does `inputs` skip the first line of the input file?为什么`inputs`会跳过输入文件的第一行?
【发布时间】:2019-09-23 13:05:06
【问题描述】:

每当我向 jq 提供文件并使用 inputs 命令时,我只会返回除第一行之外的所有行,我想知道这是为什么

我目前正在使用 jq 1.6,我正在尝试使用 inputs 命令将 TSV(制表符分隔值)转换为 JSON,方法是将文件的第一行作为标题并将每个标题作为下一行中对应值的键

如果我执行以下操作

echo -n 'line1'$'\n''line2' | jq -R 'inputs'

结果是

line2

而不是

line1
line2

正如我所料

作为一种解决方法,我目前正在为我提供给 jq 的输入添加一个新行

echo -n $'\n''line1'$'\n''line2' | jq -R 'inputs'

但我的期望是能够使用inputs 并让它处理第一行

【问题讨论】:

    标签: json csv jq


    【解决方案1】:

    jq 本身正在读取第一行,然后inputs(已收到该行作为 输入)将读取其余部分。通常,您希望使用-n 选项来阻止jq 自己进行任何读取,让任何inputinputs 过滤器进行实际读取。

    $ echo -n $'line1\nline2\n' | jq -nR 'inputs'
    "line1"
    "line2"
    

    在您的情况下,让jq 读取标题并让inputs 读取其余数据是合理的,但是您必须对标题做一些事情。这可能比它需要的更复杂,但确实有效:

    $ cat tmp.tsv
    foo bar baz
    1   2   3
    4   5   6
    $ jq -R 'split("\t") as $h | [inputs | split("\t") | [{key: $h[0], value: .[0]}, {key: $h[1], value: .[1]}, {key: $h[2], value: .[2]}] | from_entries]' tmp.tsv
    [
      {
        "foo": "1",
        "bar": "2",
        "baz": "3"
      },
      {
        "foo": "4",
        "bar": "5",
        "baz": "6"
      }
    ]
    

    jq 读取第一行并将其拆分为数组h,然后将该行提供给忽略它但使用inputs 读取其余行的过滤器,将每一行拆分并创建一个dict 使用(重复)$h 的值。

    【讨论】:

    • 鼓励使用objectify 定义可能会更好,例如作为def objectify($h): . as $in | reduce range(0; $h|length) as $i ({}; .[$h[$i]] = $in[$i]);
    【解决方案2】:

    @chepner 对-n 的解释很好,但我想说明debug 如何帮助澄清和/或揭开 jq 的行为的神秘面纱。

    由于每个 jq 程序都是一个过滤器,因此始终可以通过在其前面加上 debug 来查看任何给定过滤器的输入是什么,例如:

    echo 1 2 3 | jq 'debug | inputs'
    

    产量:

    ["DEBUG:",1]
    2
    3
    

    也就是说,在这种情况下,inputs 的输入为 1,由 inputs 使用,否则将被忽略。

    我们可以类似地检查使用-n 命令行选项的效果:

    echo 1 2 3 | jq -n 'debug | inputs'
    ["DEBUG:",null]
    1
    2
    3
    

    也就是说,我们现在可以看到 -n 选项告诉 jq 提供 null 作为 inputs 的输入,而不是从 STDIN 获取它。

    总之debug不仅对调试有帮助,对DIY理解也有帮助。

    【讨论】:

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