jq를 사용하여 json 파일에서 값 검색

jq를 사용하여 json 파일에서 값 검색

"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

관련 정보