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]
вместо.