Wie verwende ich jq, um Zahlen in Zeichenfolgen umzuwandeln?

73

Mit dem folgenden jq-Befehl und Json:

jq '.[]|[.string,.number]|join(": ")' <<< '
[
  {
    "number": 3,
    "string": "threee"
  },
  {
    "number": 7,
    "string": "seven"
  }
]
'

Ich versuche, die Ausgabe wie folgt zu formatieren:

three: 3
seven: 7

Leider führt mein Versuch zu folgendem Fehler:

jq: error: string und number können nicht hinzugefügt werden

Wie konvertiere ich die Zahl in einen String, damit beide verbunden werden können?

AX Labs
quelle

Antworten:

75

Der Befehl jq hat die Funktion tostring . Ich habe eine Weile gebraucht, um zu lernen, wie man es durch Ausprobieren benutzt. So verwenden Sie es:

jq -r '.[] | [ .string, .number|tostring ] | join(": ")' <<< '
[{ "number": 9, "string": "nine"},
 { "number": 4, "string": "four"}]
'
nine: 9
four: 4
AX Labs
quelle
2
Vielen Dank, sehr hilfreich. Ich finde jq schwer zu bedienen und schlecht dokumentiert, daher helfen diese Beispiele wirklich.
Onkel Long Hair
42

Ein alternatives und wohl intuitiveres Format ist:

jq '.[] | .string + ": " + (.number|tostring)' <<< ...

Erwähnenswert ist die Notwendigkeit von Parens .number|tostring.

Andrew Neilson
quelle
Für meinen Anwendungsfall musste ich die Klammern behalten, um die Dinge zu priorisieren. Es ist besser, sie für allgemeine Anwendungsfälle aufzubewahren.
SebMa
6

Für solche einfachen Fall String Interpolation ‚s implizite Casting - String wird es tun:

.[] | "\( .string ): \( .number )"

Sehen Sie es in Aktion auf jq‣play .

Mann bei der Arbeit
quelle
-1

Verwenden Sie den Opearator 'map_values', um Objekte zu ändern

Beispiel

{"foo": {"bar": 3}}

.foo.bar = .foo.bar | map_values ​​(tostring)

Ausgabe

{"foo": {"bar": "3"}}

mniva
quelle