![JSON 문자열에서 데이터 추출](https://linux55.com/image/136790/JSON%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%97%90%EC%84%9C%20%EB%8D%B0%EC%9D%B4%ED%84%B0%20%EC%B6%94%EC%B6%9C.png)
다음과 같이 JSON 문자열에서 번호판 번호와 관련 신뢰도를 추출해야 합니다.
{
"response": {
"container": {
"id": "0df307bc-06b2-45cf-b7ff-ce07fd04e04d",
"timestamp": "2018-Jul-10 17:34:27.448632"
},
"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": "1104009",
"poly": {
"p": { "x": "1088", "y": "642" },
"p": { "x": "1210", "y": "634" },
"p": { "x": "1210", "y": "661" },
"p": { "x": "1087", "y": "669" }
}
}
},
"det_time_us": "1710270"
}
}
}
나는 다음과 같은 것을 가지고 있습니다 :
$ jq -r '.frames.frame.lps.lp|.characters.characater.code_ascii,.characters.characater.confidence' test.json
그러나 그것은 단지 하나의 문자만을 반환하고 그것은 conf입니다. 분수....
질문
- 모든 문자와 관련 점수를 어떻게 다시 받을 수 있나요?
산출
출력은 다음과 같을 것으로 예상됩니다.
1 97, 5 89, 4 97,5 97, 1 77,B 97, B 94, L 34, J, 57,J 57, 4 7, 1 97, 5 89, 4 97, 5 97, 1 77, B 97, B 94, L 34
노트:형식은 다를 수 있습니다. 이는 추출하려는 데이터를 나타냅니다.
복사 및 붙여 넣기
입력 파일 "test.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
답변1
이것은 새롭고 향상된 답변입니다. 이전 답변은 최종 구분 기호 뒤에서 찾을 수 있습니다.
데이터의 문제는 .frame.frames.lps.lp.characters
고유하지 않은 키( characater
)를 가진 개체가 포함되어 있다는 것입니다. 이미 존재하는 키에 값을 할당할 때마다 이전 값은 손실됩니다.
jq
유틸리티의 "스트림" 입력( )을 사용하여 이 문제를 해결할 수 있습니다 --stream
.
$ 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
입력 스트림은 먼저 깊이 5(경로의 길이 .frame.frames.lps.lp.characters
)에서 잘린 다음 문제의 키로 시작하는 모든 하위 경로를 추출합니다 characater
. 이것이 내부 truncate_stream()
와 외부가 select()
하는 일입니다. 그런 다음 각 하위 경로의 최상위 수준이 잘리고 나머지는 개체 스트림으로 재구성됩니다. 그것이 truncate_stream()
외부가 그것을 감싸는 호출로 하는 일입니다 fromstream()
.
처리하는 동안 수정된 문서는 다음과 같습니다(질문의 예 제공).
{"poly":{"p":{"x":"1094","y":"667"}},"bkcolor":"16777215","color":"0","code":"49","code_ascii":"1","confidence":"97"}
{"poly":{"p":{"x":"1102","y":"667"}},"bkcolor":"16777215","color":"0","code":"53","code_ascii":"5","confidence":"89"}
{"poly":{"p":{"x":"1112","y":"666"}},"bkcolor":"16777215","color":"0","code":"52","code_ascii":"4","confidence":"97"}
{"poly":{"p":{"x":"1123","y":"665"}},"bkcolor":"16777215","color":"0","code":"53","code_ascii":"5","confidence":"97"}
{"poly":{"p":{"x":"1133","y":"664"}},"bkcolor":"16777215","color":"0","code":"49","code_ascii":"1","confidence":"77"}
{"poly":{"p":{"x":"1153","y":"663"}},"bkcolor":"16777215","color":"0","code":"66","code_ascii":"B","confidence":"97"}
{"poly":{"p":{"x":"1163","y":"663"}},"bkcolor":"16777215","color":"0","code":"66","code_ascii":"B","confidence":"94"}
{"poly":{"p":{"x":"1190","y":"661"}},"bkcolor":"16777215","color":"0","code":"76","code_ascii":"L","confidence":"34"}
의 각 객체에 대해 fromstream
데이터는 출력 형식의 배열로 추출되어 @tsv
위의 탭으로 구분된 출력을 제공합니다.
2018년의 오래된 답변:
귀하의 배열은 적절한 JSON 배열이 아니기 때문에 characters
(각 키에 대해 동일한 이름을 가진 해시임) 마지막 값만 사용할 수 있습니다.
데이터를 전처리하여 now라는 각 객체에 대한 고유 키를 생성함으로써 이 문제를 해결할 수 있습니다 characater
.
awk '/"characater"/ { sub("\"characater\"", "\"char" ++n "\"", $0) } 1' file.json
이것은 각각 등 characater
으로 대체됩니다 .char1
char2
이제 예를 들어 다음을 사용하여 그 안의 모든 값에 액세스할 수 있습니다.
jq -r '.frames.frame.lps.lp|.characters[]|[.code_ascii,.confidence]|@tsv'
전체 파이프라인:
awk '/"characater"/ { sub("\"characater\"", "\"char" ++n "\"", $0) } 1' file.json |
jq -r '.frames.frame.lps.lp|.characters[]|[.code_ascii,.confidence]|@tsv'
결과(질문의 데이터 제공):
1 97
5 89
4 97
5 97
1 77
B 97
B 94
L 34
JSON 문서 생성을 제어하는 경우 객체를 characters
적절한 배열로 변환하는 것을 고려해야 합니다.
답변2
sed
입력이 유효한 JSON이 아닌 경우 , awk
, 유형 솔루션을 사용해야 할 수도 있습니다 grep
. 이를 위해 다음은 단일 문자열로 "축소된" 입력을 처리할 수 있습니다.
$ grep -oP '"code_ascii":"\w+","confidence":"\w+"' <FILE> | grep -oP '(?<=:)"\w+"' | paste - -
예
$ grep -oP '"code_ascii":"\w+","confidence":"\w+"' b.json | grep -oP '(?<=:)"\w+"' | paste - -
"1", "97"
"5", "89"
"4", "97"
"5", "97"
"1", "77"
"B", "97"
"B", "94"
"L", "34"
"J", "57"
"J", "57"
"4", "7"
"1", "97"
"5", "89"
"4", "97"
"5", "97"
"1", "77"
"B", "97"
"B", "94"
"L", "34"
대안
노트:여러 행의 입력 데이터로 작업합니다.
sed+붙여넣기$ sed -n '/code_ascii/,/confidence/p' a.json | sed 's/.*: [^"]*//' | paste - -
sed, awk, 붙여넣기
$ sed -n '/code_ascii/,/confidence/p' a.json | awk -F': ' '{print $2}' | paste -d" " - -
sed, grep, 붙여넣기
$ sed -n '/code_ascii/,/confidence/p' a.json | grep -oP '(?<=: ).*$' | paste - -
grep+붙여넣기
$ grep -oP '"code_ascii":"\w+","confidence":"\w+"' b.json | grep -oP '(?<=:)"\w+"' | paste - -
답변3
grep + sed + tr:
grep -e code_ascii -e confidence <file> | sed 's/.*: "\(.*\)"/\1/;' | tr "\n" ' '
반품:
20, 1, 97 5, 89 4, 97 5, 97 1, 77 B, 97 B, 94 L, 34 J, 57 J, 57 4, 7 1, 97 5, 89 4, 97 5, 97 1, 77 B, 97 B, 94 L, 34
이 명령은 code_ascii +신뢰 쌍만 반환합니다.
grep -e code_ascii -e confidence <file> | sed -n 's/.*code_ascii": "\(.*\)"/\1/;T;h;n;s/.*"confidence": "\(.*\)"/\1/;T;H;g;p' | tr "\n" " "
반품:
1, 97 5, 89 4, 97 5, 97 1, 77 B, 97 B, 94 L, 34 J, 57 J, 57 4, 7 1, 97 5, 89 4, 97 5, 97 1, 77 B, 97 B, 94 L, 34
이제 위의 Kusalananda의 게시물을 참조하세요. 그냥 sed + tr:
sed -i 's/},/},\n/g' <tempfile>
sed -n 's/characater//;T;:z;n;s/.*code_ascii": "\(.*\)"/\1/;Tz;:zz;h;n;s/.*"confidence": "\(.*\)"/\1/;Tzz;H;s/$//;Tz;g;p' <tempfile> | tr "\n" " "
반품:
1, 97 5, 89 4, 97 5, 97 1, 77 B, 97 B, 94 L, 34