パイプラインの後に2つの連続OPが発生しますか、それとも一度に2つのjq OPが発生しますか?

パイプラインの後に2つの連続OPが発生しますか、それとも一度に2つのjq OPが発生しますか?

少し変形したJSON文字列からデータを抽出する必要があるため、まずsed&を渡しますawk。私が持っているのは次のコマンドです。

`sed 's/},/},\n/g' test.json |awk '/"characater"/ { gsub("\"characater\"", "\"char" ++n "\"", $0) } 1'| jq -r '.frames.frame.lps.lp|.characters[]|[.code_ascii,.confidence]|@tsv'` 

次のようにJSON文字列からデータを抽出します。

{"response":{"container":{"id":"41d6efcb-24d6-490d-8880-762255519b5f","timestamp":"2018-Jul-11 19:51:06.461665"},"id":"00000002-0000-0000-0000-000000000015"},"frames":{"frame":{"id":"5583","timestamp":"2016-Nov-30 13:05:27","lps":{"lp":{"licenseplate":"15451BBL","text":"15451BBL","wtext":"15451BBL","confidence":"20","bkcolor":"16777215","color":"16777215","type":"0","ntip":"11","cct_country_short":"","cct_state_short":"","tips":{"tip":{"poly":{"p":{"x":"1094","y":"643"},"p":{"x":"1099","y":"643"},"p":{"x":"1099","y":"667"},"p":{"x":"1094","y":"667"}},"bkcolor":"16777215","color":"0","code":"49","code_ascii":"1","confidence":"97"},"tip":{"poly":{"p":{"x":"1103","y":"642"},"p":{"x":"1113","y":"642"},"p":{"x":"1112","y":"667"},"p":{"x":"1102","y":"667"}},"bkcolor":"16777215","color":"0","code":"53","code_ascii":"5","confidence":"89"},"tip":{"poly":{"p":{"x":"1112","y":"640"},"p":{"x":"1122","y":"640"},"p":{"x":"1122","y":"666"},"p":{"x":"1112","y":"666"}},"bkcolor":"16777215","color":"0","code":"52","code_ascii":"4","confidence":"97"},"tip":{"poly":{"p":{"x":"1123","y":"640"},"p":{"x":"1132","y":"640"},"p":{"x":"1131","y":"665"},"p":{"x":"1123","y":"665"}},"bkcolor":"16777215","color":"0","code":"53","code_ascii":"5","confidence":"97"},"tip":{"poly":{"p":{"x":"1134","y":"640"},"p":{"x":"1139","y":"640"},"p":{"x":"1139","y":"664"},"p":{"x":"1133","y":"664"}},"bkcolor":"16777215","color":"0","code":"49","code_ascii":"1","confidence":"77"},"tip":{"poly":{"p":{"x":"1154","y":"639"},"p":{"x":"1163","y":"639"},"p":{"x":"1163","y":"663"},"p":{"x":"1153","y":"663"}},"bkcolor":"16777215","color":"0","code":"66","code_ascii":"B","confidence":"97"},"tip":{"poly":{"p":{"x":"1164","y":"638"},"p":{"x":"1173","y":"638"},"p":{"x":"1173","y":"663"},"p":{"x":"1163","y":"663"}},"bkcolor":"16777215","color":"0","code":"66","code_ascii":"B","confidence":"94"},"tip":{"poly":{"p":{"x":"1191","y":"637"},"p":{"x":"1206","y":"636"},"p":{"x":"1205","y":"660"},"p":{"x":"1190","y":"661"}},"bkcolor":"16777215","color":"0","code":"76","code_ascii":"L","confidence":"34"},"tip":{"poly":{"p":{"x":"1103","y":"655"},"p":{"x":"1111","y":"655"},"p":{"x":"1111","y":"667"},"p":{"x":"1103","y":"667"}},"bkcolor":"16777215","color":"0","code":"74","code_ascii":"J","confidence":"57"},"tip":{"poly":{"p":{"x":"1103","y":"655"},"p":{"x":"1111","y":"655"},"p":{"x":"1111","y":"667"},"p":{"x":"1103","y":"667"}},"bkcolor":"16777215","color":"0","code":"74","code_ascii":"J","confidence":"57"},"tip":{"poly":{"p":{"x":"1176","y":"638"},"p":{"x":"1185","y":"637"},"p":{"x":"1184","y":"661"},"p":{"x":"1175","y":"662"}},"bkcolor":"16777215","color":"0","code":"52","code_ascii":"4","confidence":"7"}},"ncharacter":"8","characters":{"characater":{"poly":{"p":{"x":"1094","y":"643"},"p":{"x":"1099","y":"643"},"p":{"x":"1099","y":"667"},"p":{"x":"1094","y":"667"}},"bkcolor":"16777215","color":"0","code":"49","code_ascii":"1","confidence":"97"},"characater":{"poly":{"p":{"x":"1103","y":"642"},"p":{"x":"1113","y":"642"},"p":{"x":"1112","y":"667"},"p":{"x":"1102","y":"667"}},"bkcolor":"16777215","color":"0","code":"53","code_ascii":"5","confidence":"89"},"characater":{"poly":{"p":{"x":"1112","y":"640"},"p":{"x":"1122","y":"640"},"p":{"x":"1122","y":"666"},"p":{"x":"1112","y":"666"}},"bkcolor":"16777215","color":"0","code":"52","code_ascii":"4","confidence":"97"},"characater":{"poly":{"p":{"x":"1123","y":"640"},"p":{"x":"1132","y":"640"},"p":{"x":"1131","y":"665"},"p":{"x":"1123","y":"665"}},"bkcolor":"16777215","color":"0","code":"53","code_ascii":"5","confidence":"97"},"characater":{"poly":{"p":{"x":"1134","y":"640"},"p":{"x":"1139","y":"640"},"p":{"x":"1139","y":"664"},"p":{"x":"1133","y":"664"}},"bkcolor":"16777215","color":"0","code":"49","code_ascii":"1","confidence":"77"},"characater":{"poly":{"p":{"x":"1154","y":"639"},"p":{"x":"1163","y":"639"},"p":{"x":"1163","y":"663"},"p":{"x":"1153","y":"663"}},"bkcolor":"16777215","color":"0","code":"66","code_ascii":"B","confidence":"97"},"characater":{"poly":{"p":{"x":"1164","y":"638"},"p":{"x":"1173","y":"638"},"p":{"x":"1173","y":"663"},"p":{"x":"1163","y":"663"}},"bkcolor":"16777215","color":"0","code":"66","code_ascii":"B","confidence":"94"},"characater":{"poly":{"p":{"x":"1191","y":"637"},"p":{"x":"1206","y":"636"},"p":{"x":"1205","y":"660"},"p":{"x":"1190","y":"661"}},"bkcolor":"16777215","color":"0","code":"76","code_ascii":"L","confidence":"34"}},"det_time_us":"1072592","poly":{"p":{"x":"1088","y":"642"},"p":{"x":"1210","y":"634"},"p":{"x":"1210","y":"661"},"p":{"x":"1087","y":"669"}}}},"det_time_us":"1720812"}}}

または次のリンクから:https://drive.google.com/file/d/18wCzjMBpw7SIeVFByAGPQiqCBjg_0te3/view?usp=sharing
これでこれはうまくいきますが、.frames.frame.lps.lp.ncharacterJSONからも抽出する必要があります。上記のようなことが簡単にできることはわかっていますが、文字列で構成された巨大なJSONファイルを解析するには、これらのコマンドが必要で、文字列はリンクに表示される形式であり、パラメータを表示する必要があるため機能しませcat test.json | jq -r '.frames.frame.lps.lp.ncharacter';ん。.ncharacter抽出された文字を含む行は、次のような出力が必要なことを意味します。

...
X       99
Y       99 previous data formatted in the same way
8
1       97
5       89
4       97
5       97
1       77
B       97
B       94
L       34
6          following data formatted in the same way
Z       99
...

上位8つは.ncharacterパラメータです。私は試した:

sed 's/},/},\n/g' test.json |awk '/"characater"/ { gsub("\"characater\"", "\"char" ++n "\"", $0) } 1'| jq -r '[.frames.frame.lps.lp.ncharacter],.frames.frame.lps.lp|.characters[]|[.code_ascii,.confidence]|@tsv'

しかし、これが私に与えるjq: error (at <stdin>:102): Cannot index array with string "characters"理由はわかりません...

ベストアンサー1

確認する:

最初の亜種

perl -pe 's/"characater"/"\"char" . (++$n) . "\""/ge' input.json |
jq -r '.frames.frame.lps.lp|.ncharacter,(.characters[]|[.code_ascii,.confidence]|@tsv)'

説明する

  1. perl -pe 's/"characater"/"\"char" . (++$n) . "\""/ge' input.json

    • -p- 各行を繰り返し、次のように印刷しますsed
    • -e- 1行のプログラムを入力するために使用することができます。与えられると、-ePerlは引数リストにファイル名を見つけません。
    • s///ge- g: グローバル置換、e: 置換コマンドの右側を式で評価します。
    • "\"char" . (++$n) . "\""- ポイントは接続に使用されます。
  2. jq -r '.frames.frame.lps.lp|.ncharacter,(.characters[]|[.code_ascii,.confidence]|@tsv)'

    • .frames.frame.lps.lp|- で作成できるので、.frames | .frame | .lps | .lp |次のように動作します。入力を受け取り、すべてのframesフィールドを選択して別のフィルタにパイプし.frame、次にすべてのframeフィールドを取得して次のフィルタにパイプする.lpsなどが続行されます。バラよりjqマニュアル、これ管路部分。
    • |.ncharacter,(.characters[]|...)'-jqマニュアル、これ斑点部分:「2つのフィルタがコンマで区切られている場合、同じ入力が両方のフィルタに供給され、両方のフィルタの出力値ストリームが順番にリンクされます。は、.foo, .bar「foo」フィールドと「bar」フィールドを別々の出力として生成します。
    • (.characters[]|[.code_ascii,.confidence]|@tsv).characters[]- 括弧は、フィルタ出力とは別に処理される出力に使用されます.ncharacter

2番目の変形-gawk代わりにperlファイルjson修正を使用してください。このjq部分は最初の変形と同じです。

gawk '{ORS= (RT) ? "\"char" NR "\"" : ""; print}' RS='"characater"' input.json

ノート-perlそして、コマンドはフレームごとにブロックのカウンタをリセットgawkしません。charつまり、最初から始めchar1て最後まで増加します。

入力する- サンプルが3回複製されました。

出力

8
1   97
5   89
4   97
5   97
1   77
B   97
B   94
L   34
8
1   97
5   89
4   97
5   97
1   77
B   97
B   94
L   34
8
1   97
5   89
4   97
5   97
1   77
B   97
B   94
L   34

おすすめ記事