jq --raw-output все еще производит кавычки, не может преобразовать значения в строку - PullRequest
1 голос
/ 09 апреля 2020

Я звоню jq с параметром -r, но все еще в результатах, строки в кавычках. Как я могу избавиться от кавычек?

(я хочу все или в кавычках или без них)

jq -r '.[][] | [.name, .allocatedVCores, .runningContainers, .allocatedVcoreSeconds, .allocatedMemorySeconds]'

[
  "TestCase1_2a4e36be647a6abaf65c48fd1d3c8300",
  1,
  1,
  86708,
  88789601
]
[
  "TestCase2_2a6a14ec8365c4836bafd3fdbe647a00",
  239,
  239,
  3531555,
  5416951035
]
...

Если я позвоню | .join("`"), я получу jq: error (at <stdin>:87): string ("`") and number (1) cannot be added

Ok строка и номер не могут быть добавлены. Это имеет смысл. Но я не могу преобразовать все в строку. Я пытался преобразовать его, используя | tostring | .join("`"), но это не работает.

Итак, я попытался преобразовать каждое значение по отдельности

jq -r '.[][] | [ .name|tostring, .allocatedVCores|tostring, .runningContainers|tostring, .allocatedVcoreSeconds|tostring, .allocatedMemorySeconds|tostring] | join("`")'

, но вдруг jq не распознает один из ключей. Он может либо фильтровать для allocMemorySeconds или selectedVCores. Если я использую оба, я получаю.

jq: error (at <stdin>:87): Cannot index string with string "allocatedMemorySeconds"

Этот ключ существует, и без преобразования в строку он работает безупречно. Я понятия не имею, почему это происходит.

Я пытаюсь добиться этого вывода

`TestCase1_2a4e36be647a6abaf65c48fd1d3c8300`1`1`86708`88789601`
`TestCase2_2a6a14ec8365c4836bafd3fdbe647a00`239`239`3531555`5416951035`

По сути, просто конвертируем некоторые json в "csv" с обратными галочками в качестве разделителя. Я использую JQ версии 1.5. Есть идеи как этого добиться?

Входные данные

{
  "applications" : [ {
    "applicationId" : "application_1558485728047_0016",
    "name" : "TestCase1_2a4e36be647a6abaf65c48fd1d3c8300",
    "startTime" : "2020-04-08T15:49:30.886Z",
    "user" : "yyyyyyyyyyyyyyy",
    "pool" : "root.users.yyyyyyyy",
    "state" : "RUNNING",
    "progress" : 10.0,
    "attributes" : { },
    "applicationTags" : [ "" ],
    "allocatedMemorySeconds" : 88789601,
    "allocatedVcoreSeconds" : 86708,
    "allocatedMB" : 1024,
    "allocatedVCores" : 1,
    "runningContainers" : 1,
    "mr2AppInformation" : { }
  }, {
    "applicationId" : "application_1558480857247_0015",
    "name" : "TestCase2_2a6a14ec8365c4836bafd3fdbe647a00",
    "startTime" : "2020-04-08T10:43:58.924Z",
    "endTime" : "2020-04-08T15:21:32.374Z",
    "user" : "xxxxxxx",
    "pool" : "root.users.xxxxxxx",
    "state" : "FINISHED",
    "progress" : 100.0,
    "attributes" : { },
    "applicationTags" : [ "" ],
    "allocatedMemorySeconds" : 5416951035,
    "allocatedVcoreSeconds" : 3531555,
    "allocatedMB" : 366592,
    "allocatedVCores" : 239,
    "runningContainers" : 239,
    "mr2AppInformation" : { }
  } ],
  "warnings" : [ ]
}

1 Ответ

1 голос
/ 10 апреля 2020

Вопрос просит удалить кавычки, но затем вы говорите: «Я хочу, чтобы все было либо в кавычках, либо без них», а затем позже запрашиваете все, что разделено кавычками, и вы предоставляете пример вывода. Так что я не на 100% уверен, что именно вы хотите, но здесь все.

Во-первых, здесь все в кавычках

$ jq '.[][] | [.name, .allocatedVCores, .runningContainers, .allocatedVcoreSeconds, .allocatedMemorySeconds] | (..|numbers) |= tostring' /tmp/data.json

[
  "TestCase1_2a4e36be647a6abaf65c48fd1d3c8300",
  "1",
  "1",
  "86708",
  "88789601"
]
[
  "TestCase2_2a6a14ec8365c4836bafd3fdbe647a00",
  "239",
  "239",
  "3531555",
  "5416951035"
]

Важной частью является бит | (..|numbers) |= tostring в конце. Он рекурсивно находит все числа и преобразует их в строки.

Теперь, чтобы получить вывод с обратными кавычками, попробуйте этот зверь

$ jq -r '.[][] | [.name, .allocatedVCores, .runningContainers, .allocatedVcoreSeconds, .allocatedMemorySeconds] | (..|numbers) |= tostring | reduce .[] as $i (null; (.//"") + (if . == null then $i else "`" + $i end))//"" | ("`" + . + "`")'

`TestCase1_2a4e36be647a6abaf65c48fd1d3c8300`1`1`86708`88789601`
`TestCase2_2a6a14ec8365c4836bafd3fdbe647a00`239`239`3531555`5416951035`

Это украдет определение join из текущего jq , с которым связан вышеуказанный комментатор, так что вы можете объединить строки с вашей текущей версией. Затем в конце он оборачивает всю строку в кавычки; иначе вы не получите их в начале и в конце.

Кстати, я пробовал эту команду с join на 1.5, и она работала нормально:

$ jq -r '.[][] | [.name, .allocatedVCores, .runningContainers, .allocatedVcoreSeconds, .allocatedMemorySeconds] | (..|numbers) |= tostring | join("`") | ("`" + . + "`")'

`TestCase1_2a4e36be647a6abaf65c48fd1d3c8300`1`1`86708`88789601`
`TestCase2_2a6a14ec8365c4836bafd3fdbe647a00`239`239`3531555`5416951035`

Однако вы упомянули о наличии проблема с join, поэтому я хотел предоставить опцию без нее.

Надеюсь, одна из них поможет. Удачи!

...