Nicht.

Nicht.

Eingabe data.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
  } ]
}

Erwartete Ausgabe

User Size
aaa   121
bbb   123

Wie konvertiere ich JSON in die obige Tabelle? Bitte helfen Sie mir.

Antwort1

Obwohl ich mit @gronostaj völlig einer Meinung bin, dass Sie es NICHT als Analysetool für JSON verwenden sollten awk, sedweiß ich, dass es manchmal Fälle geben kann, in denen Sie nichts anderes verwenden können als das, was im Betriebssystem enthalten ist.

Wenn Sie absolut sicher sind, dass das von Ihnen gepostete JSON immer im selben Format vorliegt, in dem Sie es gepostet haben, finden Sie die folgende Lösung:

#!/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) }
'

Antwort2

Die einzig ehrlich richtige Antwort ist:

Nicht.

awkund sedsind nicht die richtigen Werkzeuge für diese Aufgabe. Sie werden nicht in der Lage sein, JSON-Escape und -Kodierung richtig zu handhaben. Sie könnten versuchen, einige Basisfälle abzudecken, aber Sie könnten genauso gut einfach ein richtiges Werkzeug verwenden:jq.

jqLösung

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

(alternativ können Sie JSON in den Befehl einspeisen, anstatt es aus der Datei zu lesen)

So richten Sie Spalten aus:

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

verwandte Informationen