2016-09-29 6 views
1

jsonを使用して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がある場合は、それを使用できる可能性があります。ここで、それが何をするかを示すtypescriptですある:

$ 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 |エラー番号::1):エラー番号:(エラー番号::1):で番号をインデックスできません。文字列 "id"。おそらく、入力をドキュメントではなく文字列として扱っていますか? – Synesso

+0

'foreach'と' inputs'を使うと、それらを読み込むのが最善でしょう。また、gzcatの出力が何であるかを知らないと、正しい方向に向けるのが難しいです:.idはどこから来たのですか?おそらく 'line \(。)is \($ line | .id)'ですか? – peak

+0

ああ、それは 'foreach'の素晴らしい使い方です。それは私が実現したよりもずっと便利です。私はそれが文字通り 'reduce'のクローンだと思ったが、追加の' extract'部分を持っていた。私は抽出部分がすべての入力に適用されていることを認識していませんでした、私はそれが最後に一度だけ適用されたと思った。 –

関連する問題