为什么`inputs`跳过输入文件的第一行? [英] Why does `inputs` skip the first line of the input file?

查看:16
本文介绍了为什么`inputs`跳过输入文件的第一行?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

每当我向JQ提供文件并使用inputs命令时,我只得到除第一行以外的所有行,我想知道为什么会这样

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

如果我执行以下命令

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

结果为

line2

而不是

line1
line2

正如我所料

作为一种解决办法,我当前在提供给JQ的输入中添加了一个新行,如

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

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

推荐答案

jq本身正在读取第一行,然后inputs(将该行作为输入接收)将读取其余行。通常,您希望使用-n选项来阻止jq本身执行任何读取操作,而让任何inputinputs筛选器执行实际读取操作。

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

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

$ cat tmp.tsv
foo bar baz
1   2   3
4   5   6
$ jq -R 'split("	") as $h | [inputs | split("	") | [{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读取其余行,将每行拆分并使用$h的值(重复)创建词典。

这篇关于为什么`inputs`跳过输入文件的第一行?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆