我正在使用jq将json文档的文件转换为不同形状的json文档的文件。我需要输出文件有一个连续的积极的ID。我可以访问一个等于所看到换行符数量的变量吗?当在bash中管道时获取行号(换行符数)
gzcat input.gz | jq -r '"{\"id\":???, \"foo\":\(.foo)}"' > output
# can anything take the place of ??? to give 0..n?
我正在使用jq将json文档的文件转换为不同形状的json文档的文件。我需要输出文件有一个连续的积极的ID。我可以访问一个等于所看到换行符数量的变量吗?当在bash中管道时获取行号(换行符数)
gzcat input.gz | jq -r '"{\"id\":???, \"foo\":\(.foo)}"' > output
# can anything take the place of ??? to give 0..n?
如果你的jq有input_line_number
,你可以使用它。下面是一个打字稿示出它的作用:
$ jq 'input_line_number'
"a"
1
"b"
2
(。在上文中,输入线之后紧接着输出线)
类似地,这里是如何foreach
和inputs
可以一起使用:
$ jq -n 'foreach inputs as $line (0; .+1; "line \(.) is \($line)")'
"abc"
"line 1 is abc"
123
"line 2 is 123"
如果您JQ没有foreach
,那么你可能会发现reduce
可以满足您的需要:
$ jq -s -r 'reduce .[] as $line
([0,""]; .[0]+=1 | .[1] += "line \(.[0]) is \($line)\n")
| .[1]'
输入:
"abc"
123
输出:
line 1 is abc
line 2 is 123
非常有希望。请帮助我多一点:'gzcat data/part-00001.gz |头-3 | jq -n'foreach输入为$ line(0;。+ 1;“line \(.id)is \($ line)”)'errors:'jq:error(at
如果你使用'foreach'和'inputs',最好是阅读它们。另外,不知道gzcat的输出是什么,很难指出你正确的方向:.id从哪里来?你有没有想过:'line \(。)是\($ line | .id)'? – peak
啊,这对'foreach'很有用。这比我意识到的更有用。我认为这实际上是“减少”的克隆,但是增加了“提取”部分。我没有意识到提取部分已经应用于每个输入,我认为它只在最后应用一次。 –
你居然流在'jq'有意义吗?你的例子似乎不是。 –
编号在bash管道意义上流动。已更新问题标题。 – Synesso
您可以尝试通过'cat -n'管道添加行号。如果它需要JQ格式的JSON格式,请尝试'sed'。 – dwks