在bash中设置管道时获取行号(换行数)

在bash中设置管道时获取行号(换行数),bash,jq,Bash,Jq,我正在使用jq将一个json文档文件转换为一个不同形状的json文档文件。我需要输出文档具有连续的正id。我可以访问等于看到的换行数的变量吗 gzcat input.gz | jq -r '"{\"id\":???, \"foo\":\(.foo)}"' > output # can anything take the place of ??? to give 0..n? 如果您的jq有输入行号,您可能可以使用它。下面是一个打字机脚本,说明了它的功能: $ jq 'input_line_

我正在使用jq将一个json文档文件转换为一个不同形状的json文档文件。我需要输出文档具有连续的正id。我可以访问等于看到的换行数的变量吗

gzcat input.gz | jq -r '"{\"id\":???, \"foo\":\(.foo)}"' > output
# can anything take the place of ??? to give 0..n?

如果您的jq有
输入行号
,您可能可以使用它。下面是一个打字机脚本,说明了它的功能:

$ jq 'input_line_number'
"a"
1
"b"
2
(在上面的示例中,输入行后面紧跟着输出行。)

类似地,以下是如何将
foreach
输入一起使用:

$ 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

你真的是在
jq
意义上的流媒体吗?你的例子似乎不是。在bash管道意义上的流。已更新问题标题。您可以尝试通过管道通过
cat-n
添加行号。如果jq需要JSON格式,请尝试
sed
。非常有希望。请帮助我了解更多:
gzcat数据/part-00001.gz|head-3 | jq-n'作为$line(0;+1;“line\(.id)是\($line)”)”
错误:
jq:error(at:1):无法使用字符串“id”索引数字。
。它将输入视为字符串,而不是文档?如果使用
foreach
inputs
,最好仔细阅读它们。另外,由于不知道gzcat的输出是什么,很难为您指出正确的方向:id来自哪里?你的意思可能是:
line\(.)是\($line |.id)
?啊,这是
foreach
的一个很好的用法。它比我意识到的有用得多。我原以为它是
reduce
的一个克隆,但有一个额外的
extract
部分。我没有意识到提取部分应用于每个输入,我认为它在最后只应用了一次。