"game", "toy", "book" 뒤에 값을 인쇄하는 방법은 무엇입니까? 다음은 파일에 대한 jq '.'의 출력입니다.
{ "reports": [ { "games": 3, "toys": 0, "books": 3, "to": "2017-07-22T00:00:00.000+0000", "from": "2017-07-21T00:00:00.000+0000", "eventType": "bookedIn", "rowName": "CWQ" }, { "games": 0, "toys": 0, "books": 0, "to": "2017-07-22T00:00:00.000+0000", "from": "2017-07-21T00:00:00.000+0000", "eventType": "bookedOut", "rowName": "AED" } ] }
나는 전에 시도했다
{ echo "["; 고양이 파일; echo "]" } | jq -r ' .[] | ( "\n" + .rowName + ":", "게임-> " + (.games | tostring ) "장난감-> " + (.toys | tostring), "책-> " + (.books | tostring) ))'
내가 뭔가 잘못한 것 같습니다.
고쳐 쓰다 내가 아는 한, 책에 공급자와 이름이라는 두 가지 다른 항목이 있다고 가정해 보겠습니다. -?
jq -r '.reports |
.[] |
("\n" + .rowName + ":",
"Games: " + (.games | tostring),
"Toys: " + (.toys | tostring),
.books | .[] |
("\n" + .name + ": ",
"provider: " + (.provider | tostring) ) )
' response.json
jq: 오류(response.json:1): Cannot iterate over null(null)이 발생합니다.
답변1
JSON 명령줄 파서를 사용하십시오 jq
.
$ jq -r '.reports[] |
"\(.rowName) :",
"books -> \(.books)",
"toys -> \(.toys)",
"games -> \(.games)\n"' input.json
CWQ:
books -> 3
toys -> 0
games -> 3
AED:
books -> 0
toys -> 0
games -> 0
참고: 이는 jq
문자열 보간을 사용하고 배열의 모든 항목을 반복하여 reports
관련 정보를 선택합니다.
.books
업데이트: 객체 배열 작업 :
주어진
{
"reports": [
{
"games": 3,
"toys": 0,
"books": [
{
"provider": "The provider",
"name": "The name"
}
],
"to": "2017-07-22T00:00:00.000+0000",
"from": "2017-07-21T00:00:00.000+0000",
"eventType": "bookedIn",
"rowName": "CWQ"
},
{
"games": 0,
"toys": 0,
"books": [
{
"provider": "The 1st provider",
"name": "The 1st name"
},
{
"provider": "The 2nd provider",
"name": "The 2nd name"
}
],
"to": "2017-07-22T00:00:00.000+0000",
"from": "2017-07-21T00:00:00.000+0000",
"eventType": "bookedOut",
"rowName": "AED"
}
]
}
우리는 간단히 할 수 있습니다
$ jq -r '.reports[] |
"\(.rowName):",
( .books[] | "book name -> \(.name)",
"book provider -> \(.provider)" ),
"toys -> \(.toys)",
"games -> \(.games)\n"'
CWQ:
book name -> The name
book provider -> The provider
toys -> 0
games -> 3
AED:
book name -> The 1st name
book provider -> The 1st provider
book name -> The 2nd name
book provider -> The 2nd provider
toys -> 0
games -> 0
답변2
awk -v RS='[{},]' '/^"(games|toys|books)"/{ sub("^.*:",""); print; }' file
0
0
0
50
30
20
10
30
20
아니면 한 단어만 사용하세요.
awk -v pattern=games -v RS='[{},]' '$0 ~ "^\"" pattern "\"" { sub("^.*:",""); print; }' file
0
50
10
답변3
JSON 파서를 사용하여 이 JSON을 구문 분석해 보겠습니다.잭.
jq -r '
.reports |
.[] |
(
"\n" + .rowName + ":",
"games -> " + (.games | tostring),
"toys -> " + (.toys | tostring),
"books -> " + (.books | tostring)
)
' file
CWQ:
games -> 3
toys -> 0
books -> 3
AED:
games -> 0
toys -> 0
books -> 0