2016-09-29 103 views
1

我正在使用jq将json文档的文件转换为不同形状的json文档的文件。我需要输出文件有一个连续的积极的ID。我可以访问一个等于所看到换行符数量的变量吗?当在bash中管道时获取行号(换行符数)

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

你居然流在'jq'有意义吗?你的例子似乎不是。 –

+0

编号在bash管道意义上流动。已更新问题标题。 – Synesso

+1

您可以尝试通过'cat -n'管道添加行号。如果它需要JQ格式的JSON格式,请尝试'sed'。 – dwks

回答

2

如果你的jq有input_line_number,你可以使用它。下面是一个打字稿示出它的作用:

$ jq 'input_line_number' 
"a" 
1 
"b" 
2 

(。在上文中,输入线之后紧接着输出线)

类似地,这里是如何foreachinputs可以一起使用:

$ 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 
+0

非常有希望。请帮助我多一点:'gzcat data/part-00001.gz |头-3 | jq -n'foreach输入为$ line(0;。+ 1;“line \(.id)is \($ line)”)'errors:'jq:error(at :1):Can not index number with字符串“id”'。它可能将输入视为字符串而不是文档? – Synesso

+0

如果你使用'foreach'和'inputs',最好是阅读它们。另外,不知道gzcat的输出是什么,很难指出你正确的方向:.id从哪里来?你有没有想过:'line \(。)是\($ line | .id)'? – peak

+0

啊,这对'foreach'很有用。这比我意识到的更有用。我认为这实际上是“减少”的克隆,但是增加了“提取”部分。我没有意识到提取部分已经应用于每个输入,我认为它只在最后应用一次。 –