Получить элемент и последующий элемент на основе свойства первого - PullRequest
1 голос
/ 20 октября 2019

У меня есть файл журнала событий, созданный сторонним инструментом, который я не могу изменить. Итак, этот файл журнала представляет собой огромный массив JSON, в котором элементы odds содержат метаданные, а пары содержат сообщение тела, связанное с метаданными. Я хочу иметь возможность разбивать файл в зависимости от метаданных, агрегируя информацию по темам в разных файлах.

Я работаю над этим проектом в Windows и пытаюсь использовать его с помощью командного файла и JQ.

В основном массив выглядит так:

[
  { "type": "abc123"},
  {"name":"first component of type abc123"},
   { "type": "abc123"},
  {"name":"second component of type abc123"},
  { "type": "def124"},
  {"name":"first component of type def124"},
  { "type": "xyz999"},
  {"name":"first component of type xyz999"},
  { "type": "abc123"},
  {"name":"third component of type abc123"},
  { "type": "def124"},
  {"name":"second component of type def124"},
  { "type": "abc123"},
  {"name":"fifth component of type abc123"},
  { "type": "abc123"},
  {"name":"sixth component of type abc123"},
  { "type": "def124"},
  {"name":"third component of type def124"},
  { "type": "def124"},
  {"name":"fourth component of type def124"},
  { "type": "abc123"},
  {"name":"seventh component of type abc123"},
  { "type": "xyz999"},
  {"name":"second component of type xyz999"}
  ...
]

Я знаючто у меня есть только 3 типа, поэтому я пытаюсь заархивировать файл для каждого из них. что-то вроде:

Первый файл

{
  "componentLog": {
       "type": "abc123",
       "information": [
          "first component of type abc123",
          "second component of type abc123",
          "third component of type abc123",
          ...
       ]
     }
}

Второй файл

{
  "componentLog": {
       "type": "def124",
       "information": [
          "first component of type def124",
          "second component of type def124",
          "third component of type def124",
          ...
       ]
     }
}

Третий файл

{
  "componentLog": {
       "type": "xyz999",
       "information": [
          "first component of type xyz999",
          "second component of type xyz999",
          "third component of type xyz999",
          ...
       ]
     }
}

Я знаю, что могу разделять метаданныес этим

jq.exe ".[] | select(.type==\"product\")" file.json

И затем я пытаюсь математически вычислить индекс index .But, просто возвращает индекс первого элемента, который содержит оператор выбора ... Так что я не знаю, как это решить...

1 Ответ

0 голосов
/ 20 октября 2019

Следующий скрипт bash немного запутан, поскольку предполагает, что ни один из файлов (входных или выходных) не поместится в память.

Если у вас еще нет доступа к bash, sed и awk в вашемвычислительной среде, вы можете рассмотреть возможность установки , или чего-либо подобного, или вы можете адаптировать скрипт соответствующим образом, например, используя gawk для Windows ,или Ruby для Windows .

Другое основное предположение, еще не встроенное в исходный вопрос, заключается в том, что можно удалить файлы log-type*.tmp и перезаписать log-TYPE.json для различных значений. "type".

Обязательно установите input для соответствующего имени входного файла.

# The input file name:
input=file.json

/bin/rm log-type*.tmp

# Use jq to produce a stream of .type and .name values 
# as per the jq FAQ
jq -cn --stream '
   fromstream(1|truncate_stream(inputs))
   | if .type then .type else .name end'  "$input" |
 awk '
      NR%2 {fn=$1; sub("^\"","",fn); sub("\"$","", fn); next;} 
      { print > "log-type." fn ".tmp"}
'

for f in log-type.*.tmp ; do
    echo formatting $f ...
    g=$(sed -e 's/log-type.//' -e 's/.tmp$//' <<< "$f")
    echo g="$g"
    awk -v type="\"$g\"" '
      BEGIN { print "{\"componentLog\": { \"type\": " type " ,";
      print "\"information\": ["; }
      NR==1 { print; next }
      {print ",", $0} 
      END {print "]}}"; }' "$f" > "log-$g.json"
done
...