gawk со сложным разделителем записей печатает только первую запись матча

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

 $ gawk 'BEGIN{RS="{Mon,Tue} Mar {21,22} [0-9]{2}:[0-9]{2}:[0-9]{2} 2016";FS ="\n";OFS="\n"} {print savedRT, $1, $2, $3, $4} {savedRT = RT}' iostat.20160321

Mon Mar 21 20:05:00 2016
 cpu
us sy wt id
4  2  0 94

Вот шаблон для того, как отформатированы входные данные:

Mon Mar 21 20:05:00 2016
 cpu
us sy wt id
4  2  0 94
...
...
...
Mon Mar 21 20:10:00 2016
 cpu
us sy wt id
3  2  0 94
...
...
...

Есть ли глобальный флаг с gawk? Что мне не хватает?

1 ответ

Решение

Вы можете исправить это следующим образом (требуется GNU awk 1):

$ awk 'BEGIN {
    RS = "(Mon|Tue) Mar (21|22) [0-9]{2}:[0-9]{2}:[0-9]{2} 2016"
    FS = OFS = "\n"
}
NR > 1 { print savedRT $1, $2, $3, $4 }
{ savedRT = RT }' infile
Mon Mar 21 20:05:00 2016
 cpu
us sy wt id
4  2  0 94
Mon Mar 21 20:10:00 2016
 cpu
us sy wt id
3  2  0 94

Требуются следующие изменения:

  • + Изменить {Mon,Tue} а также {21,22} в разделителе записей (Mon|Tue) а также (21|22) для правильного чередования регулярных выражений
  • Только начать печатать, если NR больше 1; файл начинается с разделителя записей, поэтому первая запись пуста, и мы не хотим печатать несколько пустых строк.
  • savedRT содержит новую строку, поэтому, если мы напечатаем это как print savedRT, $1 будет одна новая строка слишком много. Изменение на print savedRT $1 удаляет этот лишний перевод строки.

1 Чтобы быть точным, GNU awk 4.0.0 или новее, как интервальные выражения [0-9]{2} не распознаются старшими зеваками, см. примечания к выпуску. Обходной путь должен просто использовать [0-9][0-9] вместо.

Другие вопросы по тегам