выходные значения файла json отсортированы - PullRequest
0 голосов
/ 03 мая 2020

У меня есть огромный json файл, который имеет такие элементы, как:

{
      "_id": {
        "$oid": "3f2"
      },
      "record_id": {
        "$oid": "f33de"
      },
      "meta": "2000",
      "code": "a",
      "index": 0,
      "value": "BSHOP",
      "lang": "en"
    },
....

{
  "_id": {
    "$oid": "5e7174e196716a797bc3bee3"
  },
  "record_id": {
    "$oid": "5e57b3dda434bdba09e39fdc"
  },
  "meta": "2001",
  "code": "b",
  "index": 1,
  "value": "Thomas J.",
  "lang": "en"
},

... что мне нужно сделать, это иметь в tsv в качестве вывода, каждая строка одно значение элемента, информация например:

for meta 2000 code a:
values
BSHOP
...

for meta 2001 code b:
values
Thomas J.
...

, поэтому мне нужен файл, в котором будут отсортированы выходные данные для каждой мета, каждого кода и соответствующих значений, найденных в этом файле json. Заранее благодарю за любую помощь

1 Ответ

0 голосов
/ 04 мая 2020

Если предположить, что входной файл (скажем, input. json) состоит из массива объектов JSON, и что входной файл не слишком большой, то следующий фильтр (в сочетании с командой -r- опция строки) будет производить результаты, как показано, потому что group_by на самом деле также выполняет sort:

group_by([.meta,.code])
| .[]
| (.[0] | ("for meta \(.meta) code \(.code):", "values")),
  (.[].value)

Если вы хотите, чтобы значения выводились на одной строке как TSV, то замените последняя строка выше:

(map(.value)|@tsv)

Если jq empty input.json не удастся из-за слишком большого ввода. json, можно использовать несколько другую трехэтапную стратегию. Вкратце, три шага будут следующими:

  1. потоковый парсер jq (запускается с опцией --stream) будет использоваться вместе с опцией - c для создания табуляции список с разделителями [.meta, .code, .value];

  2. этот список будет затем отсортирован по ОС sort;

  3. инструмент, такой как jq или awk, будет использоваться для вывода в указанном формате.

...