
少し変形した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.ncharacter
JSONからも抽出する必要があります。上記のようなことが簡単にできることはわかっていますが、文字列で構成された巨大な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)'
説明する
perl -pe 's/"characater"/"\"char" . (++$n) . "\""/ge' input.json
-p
- 各行を繰り返し、次のように印刷しますsed
。-e
- 1行のプログラムを入力するために使用することができます。与えられると、-e
Perlは引数リストにファイル名を見つけません。s///ge
-g
: グローバル置換、e
: 置換コマンドの右側を式で評価します。"\"char" . (++$n) . "\""
- ポイントは接続に使用されます。
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
答え2
これは、同じトピックに関する別の質問の連続です。ここでの主な問題は、入力に一意でないキーを持つオブジェクトが含まれていることです。これはまだ有効なJSONですが、それ以降のキーは古いキーを上書きするため、文書を解析するとデータが「失われます」。
前の質問にここに答えました。、回答で説明されている次のコマンドを使用します。
$ jq -r -n --stream 'fromstream(1|truncate_stream(5|truncate_stream(inputs)|select(.[0][0] == "characater"))) | [.code_ascii, .confidence] | @tsv' test.json
1 97
5 89
4 97
5 97
1 77
B 97
B 94
L 34
問題はこれ問題は、出力が出力ライン数の前に独自のラインにある必要があることです。これらの奇妙な形式のJSONドキュメントは1つのインスタンスではなく、セット全体が1行に1つずつあります。
以下は、結果を配列として収集して出力する前に要素数を計算する上記のコマンドを修正したものです。
$ jq -r -n --stream '[fromstream(1|truncate_stream(5|truncate_stream(inputs)|select(.[0][0] == "characater"))) | [.code_ascii, .confidence]] | length, (.[]|@tsv)' test.json
8
1 97
5 89
4 97
5 97
1 77
B 97
B 94
L 34
その後、ソースファイルの各行に対してこのコマンドを1回呼び出すだけです。
#!/bin/bash
cmd=( jq -r -n --stream '[fromstream(1|truncate_stream(5|truncate_stream(inputs)|select(.[0][0] == "characater"))) | [.code_ascii, .confidence]] | length, (.[]|@tsv)' )
while IFS= read -r json; do
printf '%s\n' "$json" | "${cmd[@]}"
done <test.json