하지 않다.

하지 않다.

입력 데이터.json

{
  "lastUpdateTime" : "2018-07-20T10:56:26.000Z",
  "items" : [ {
    "date" : "2018-07-19T21:09:27.000Z",
    "user" : "dddd",
    "size" : 5219402,
    "rawSize" : 15658206,
    "numFiles" : 119
  }, {
    "date" : "2018-07-19T21:09:27.000Z",
    "user" : "aaaa",
    "size" : 20524410845,
    "rawSize" : 61573215663,
    "numFiles" : 7540
  }, {
    "date" : "2018-07-19T21:09:27.000Z",
    "user" : "wwww",
    "size" : 0,
    "rawSize" : 0,
    "numFiles" : 2
  }, {
    "date" : "2018-07-19T21:09:27.000Z",
    "user" : "qqqq",
    "size" : 201084,
    "rawSize" : 603252,
    "numFiles" : 25
  }, {
    "date" : "2018-07-19T21:09:27.000Z",
    "user" : "ttttt",
    "size" : 280395332,
    "rawSize" : 288900666,
    "numFiles" : 199
  } ]
}

예상 출력

User Size
aaa   121
bbb   123

JSON을 위의 표로 어떻게 변환하나요? 도와주세요.

답변1

글쎄요, JSON을 구문 분석 도구로 사용하지 않거나 구문 분석 도구로 사용하지 않는다는 @gronostaj의 의견에 전적으로 동의하지만 awk때로는 sedOS와 함께 제공되는 것 외에 다른 것을 사용할 수 없는 경우가 있다는 것을 알고 있습니다.

게시한 JSON이 항상 게시한 형식과 동일하다고 확신한다면 해결 방법은 다음과 같습니다.

#!/bin/sh

data='
{
  "lastUpdateTime" : "2018-07-20T10:56:26.000Z",
  "items" : [ {
    "date" : "2018-07-19T21:09:27.000Z",
    "user" : "dddd",
    "size" : 5219402,
    "rawSize" : 15658206,
    "numFiles" : 119
  }, {
    "date" : "2018-07-19T21:09:27.000Z",
    "user" : "aaaa",
    "size" : 20524410845,
    "rawSize" : 61573215663,
    "numFiles" : 7540
  }, {
    "date" : "2018-07-19T21:09:27.000Z",
    "user" : "wwww",
    "size" : 0,
    "rawSize" : 0,
    "numFiles" : 2
  }, {
    "date" : "2018-07-19T21:09:27.000Z",
    "user" : "qqqq",
    "size" : 201084,
    "rawSize" : 603252,
    "numFiles" : 25
  }, {
    "date" : "2018-07-19T21:09:27.000Z",
    "user" : "ttttt",
    "size" : 280395332,
    "rawSize" : 288900666,
    "numFiles" : 199
  } ]
}
'
###########################################################
echo "${data}" | awk -F: 'BEGIN{
  printf ("%s\t\t%s\t%s\n","Date", "User", "Size")
}
/lastUpdateTime/ {next}
/date/ { gsub(/\"|,|\s/,""); gsub(/T.+$/,""); printf ("%s\t", $2) }
/user/ { gsub(/\"|,|\s/,""); printf ("%s\t", $2) }
/size/ { gsub(/\"|,|\s/,""); printf ("%s\n", $2) }
'

답변2

솔직하게 정답은 다음과 같습니다.

하지 않다.

awksed작업에 적합한 도구가 아닙니다 . JSON 이스케이프 및 인코딩을 제대로 처리할 수 없습니다. 몇 가지 기본 사례를 다룰 수 있지만 적절한 도구를 사용할 수도 있습니다.jq.

jq해결책

jq '.items[] | "\(.user) \(.size)"' -r /path/to/file

(또는 파일에서 JSON을 읽는 대신 JSON을 명령에 파이프할 수 있습니다)

열을 정렬하려면 다음을 수행합니다.

jq '.items[] | "\(.user) \(.size)"' -r /path/to/file | column -t

관련 정보