每当我向 jq 提供文件并使用该inputs命令时,我只会返回除第一行之外的所有行,我想知道为什么会这样
我目前正在使用 jq 1.6,我正在尝试使用该inputs命令将 TSV(制表符分隔值)转换为 JSON,方法是抓取文件的第一行作为标题并将每个标题作为相应值的键下一行
如果我执行以下
echo -n 'line1'$'\n''line2' | jq -R 'inputs'
Run Code Online (Sandbox Code Playgroud)
结果是
line2
Run Code Online (Sandbox Code Playgroud)
并不是
line1
line2
Run Code Online (Sandbox Code Playgroud)
正如我所期望的
作为一种解决方法,我目前正在为我提供给 jq 的输入添加一个新行,如下所示
echo -n $'\n''line1'$'\n''line2' | jq -R 'inputs'
Run Code Online (Sandbox Code Playgroud)
但我的期望是能够使用inputs并处理第一行
jq本身正在读取第一行,然后inputs(已接收该行作为其输入)将读取其余部分。通常,您希望使用该-n选项来防止jq自己进行任何读取,而让 anyinput或inputs过滤器进行实际读取。
$ echo -n $'line1\nline2\n' | jq -nR 'inputs'
"line1"
"line2"
Run Code Online (Sandbox Code Playgroud)
在您的情况下,让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"
}
]
Run Code Online (Sandbox Code Playgroud)
jq读取第一行并将其拆分为数组h,然后将该行提供给过滤器,该过滤器忽略它但用于inputs读取其余行,将每一行拆分并使用(重复)的值创建字典$h。