AWK: элегантный способ работы с несколькими критериями-разделителями - PullRequest
0 голосов
/ 24 июня 2018

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

[ВРЕМЯ] [ТИП] entryA: запись B: b entryC: {c1: val1, c2: val2}

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

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

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

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

записьA записьB записьC

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

1 Ответ

0 голосов
/ 24 июня 2018

РЕДАКТИРОВАТЬ: Или с sed следующие могут помочь вам, проверено на Input_file упомянул этот пост сам с первой попытки.

sed 's#entry[A-Z]:{.*}##g;s#\[TIME\] ##;s#\[TYPE\] ##'  Input_file

Поскольку вы не упомянули ожидаемый результат в своем сообщении, поэтому на основании упомянутого вами резюме только написали код, который удалит все значения, которые имеют {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\n",substr($0,pre_start+pre_end+1))
         next
      }
      prev_start=RSTART
      prev_end=RLENGTH
   }
}
'  Input_file

Вывод будет следующим.

entryA:a entryB:b entryA:a entryB:b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...