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

时间:2016-09-29 01:41:43

标签: 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?

1 个答案:

答案 0 :(得分: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