AWK: элегантный способ борьбы с несколькими критериями разграничителя

Я обрабатываю файлы журнала с awk. Некоторые строки похожи на:

[TIME] [TYPE] entryA: запись B: b entryC: имя: значение

Все первичные поля похожи name:{subentries}или /([^s]*:s[^s]*),/(субтитры имеют пробел после двоеточия). До сих пор я мог использовать разделитель пространства для обработки обычных записей или использовать регулярное выражение для соответствия содержимому в {} и извлекать данные, если он содержит подстатьи (скажем, sed). Но не все блоки {} содержат подзаголовки, и по какой-то причине я считаю, что лучше отделить обработку первичных записей и подстатей.

Можно ли сразу извлечь все первичные поля?

РЕДАКТИРОВАТЬ:

Я хочу ожидать, что вывести список первичных записей, таких как:

записьA входB записьC

Кроме того, я хочу знать, можно ли сохранить массив для записи, если запись имеет свои собственные подстатьи.

regex,awk,

-1

Ответов: 1


1

EDIT: Или соследующими может помочь вам, проверенные на Input_file упомянул этот пост в первой попытке.sed 's#entry[A-Z]:{.*}##g;s#[TIME] ##;s#[TYPE] ##' Input_file

{c1: val1, c2: val2}

Поскольку вы не указали ожидаемый результат в своем сообщении, поэтому на основе вашего упомянутого резюме только написали код, который удалит все значения, которые имеют {c1: val1, c2: val2}в строках, и распечатает все остальные значения.

Скажем, это Input_file.

cat Input_file
[TIME] [TYPE] entryA:a entryB:b entryC:{c1: val1, c2: val2} entryA:a entryB:b

Далее следует код для этого:

awk '
{
   while($0) {
      match($0,/entry[a-zA-Z]+:{[^}]*}/)
      val=substr($0,1,RSTART-1)
      gsub(/[TYPE] |[TIME] /,"",val)
      if(RSTART>1) {
         printf("%s",val)
      }
      if(RSTART && RLENGTH) {
         $0=substr($0,RSTART+RLENGTH+1)
      }
      else {
         printf("%s
",substr($0,pre_start+pre_end+1))
         next
      }
      prev_start=RSTART
      prev_end=RLENGTH
   }
}
'  Input_file

Результат будет следующим.

entryA:a entryB:b entryA:a entryB:b
регулярное выражение, AWK,
Похожие вопросы