Пусть jq возвращает номер индекса элемента в массиве - PullRequest
0 голосов
/ 31 декабря 2018

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

Используя приведенный ниже массив, я вызываю jq, чтобы найти значение "FooBar" ключа "text":

jq '.arr[] | .[3].text | tostring | select(contains("FooBar") )' < file.json

Результат:

"FooBar"

Но то, что я на самом деле хочу, - это индекс самого внешнего массива "arr", в который вложена эта пара text:FooBar, что равно 0 вэтот случай.

Может ли это быть достигнуто в JQ?

{
"arr": [
    [
      "create",
      "w71",
      "rwt.widgets.Label",
      {
        "parent": "w68",
        "style": "1",
        "bounds": "2",
        "tabIndex": -1,
        "background": "ww",
        "font": "test",
        "text": "FooBar",
        "alignment": "right"
      }
    ],
    [
          "create",
          "w72",
          "rwt.widgets.Label",
          {
            "parent": "w68",
            "style": "22",
            "bounds": "1",
            "tabIndex": -1,
            "foreground": "null",
            "background": "1",
            "font": "2",
            "text": "55",
            "alignment": "right"
          }
        ]
  ]
}

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Вот решение, которое не зависит от предположения, что объект интереса имеет фиксированную позицию в массиве:

.arr
| map( .[] | objects | .text ) 
| index("FooBar")

Более надежно:

.arr 
| map( first(.[] | objects) // null | .text )
| index("FooBar")
0 голосов
/ 31 декабря 2018

Вы можете сначала преобразовать элементы в массиве в записи, таким образом, ключ и значение присутствуют в выходных данных:

jq '.arr | to_entries'

Дайте результат, где key присутствует ввывод:

[
  {
    "key": 0,
    "value": [
      "create",
      "w71",
      "rwt.widgets.Label",
      {
        "parent": "w68",
        "style": "1",
        "bounds": "2",
        "tabIndex": -1,
        "background": "ww",
        "font": "test",
        "text": "FooBar",
        "alignment": "right"
      }
    ]
  },
  {
    "key": 1,
    "value": [
      "create",
      "w72",
      "rwt.widgets.Label",
      {
        "parent": "w68",
        "style": "22",
        "bounds": "1",
        "tabIndex": -1,
        "foreground": "null",
        "background": "1",
        "font": "2",
        "text": "55",
        "alignment": "right"
      }
    ]
  }
]

Выполнение фильтрации и возврат индекса становится довольно тривиальным:

jq '.arr | to_entries | .[] | select(.value[3].text | contains("FooBar")) | .key' <test.json
...