2015-06-02 4 views
0

Я пытаюсь использовать AWK тянуть запросы: ЗАВЕРШЕНА, НАЗНАЧЕН, НЕРАСПРЕДЕЛЕННЫЕ, РАССМОТРЕННАЯ, ОБЗОР НАЗНАЧЕН и ERROR из каждая строка в файле журнала. Конечный результат выглядит что-то близкое к:Различия между запросами, которые имеют аналогичные слова в них

COMPLETED 
COMPLETED 
UNASSIGNED 
REVIEWED 
ERROR 
... 

Однако я получаю некоторые проблемы со слов/фраз, смешиваясь друг с другом, в частности, с ОБЗОР ASSIGNED. Он принимает любое из моих заявлений, которое должно быть ОБЗОР НАЗНАЧЕН и просто делает их НАЗНАЧЕН. Моя AWK утверждение:

awk '{for(i=1;i<=NF;i++){if($i~/^(REVIEWED|COMPLETED|REVIEW ASSIGNED|ASSIGNED|UNASSIGNED|ERROR)$/){print $i}}}' myFile 

Я попытался посмотреть его, но я не знаком с AWK и не нашли ничего конкретно о том, как иметь дело с выражениями, содержащими несколько слов, учитывая, что она отделена на белом фоне.

+2

В чем проблема? Некоторые строки не совпадают? Является ли вывод не форматом, который вы хотите? Можете ли вы показать нам пример ввода и вывод, который вы хотите получить от этого ввода? –

+0

Конечно, я отредактировал сообщение немного. REVIEW ASSIGNED превращается в ASSIGNED, и я испытываю трудности с сохранением целостности прежнего утверждения из-за пробела между ними. – Dumpcats

+0

Ах. Понимаю. Автоответчик. –

ответ

2

Вы зацикливаете и сопоставляете поля за полем, но пробелы разделяют поля в awk (по умолчанию), поэтому в строке не будет REVIEW ASSIGNED.

Таким образом, вместо того, чтобы сопоставлять REVIEW ASSIGNED, как вы хотели, чтобы линия соответствовала тесту ASSIGNED.

Стоп зацикливания поля и просто использовать что-то вроде этого:

awk 'match($0, /(REVIEWED|COMPLETED|REVIEW ASSIGNED|ASSIGNED|UNASSIGNED|ERROR)/, a) {print a[0]}' myFile 

Эд Мортон указывает на то, что использование match является поглазеть конкретные (потому что он добавляет поддержку третьего аргумента массива в match). Версия, которая не использует эту функцию будет выглядеть следующим образом

awk 'match($0, /(REVIEWED|COMPLETED|REVIEW ASSIGNED|ASSIGNED|UNASSIGNED|ERROR)/) {print substr($0, RSTART, RLENGTH)}' myFile 

сторона:

Я думал, Эд Мортон указывал на то, что это регулярное выражение никогда не будет соответствовать UNASSIGNED правильно, как ASSIGNED всегда будет соответствовать первому, однако она Появился механизм awex регулярного выражения awk. Однако для двигателя, который сделал, однако, инвертирование порядка, вероятно, устранит эту проблему.

awk 'match($0, /(REVIEWED|COMPLETED|REVIEW ASSIGNED|UNASSIGNED|ASSIGNED|ERROR)/, a) {print a[0]}' myFile 
+0

Обратите внимание, что 'ASSIGNED' излишне избыточно, поскольку оно содержится как в' REVIEW ASSIGNED', так и 'UNASSIGNED'. – ghoti

+0

Без привязок к рисунку, который является истинным. Если бы я знал формат входного файла больше, я бы, вероятно, попытался включить соответствующие якоря, которые могли бы закончиться тем, что он не был полностью избыточным. Также есть что сказать (в зависимости от обстоятельств) за самодокументируемую природу включения полного набора допустимых вариантов (избыточный или нет). –

+2

Может ли строка соответствия появляться только один раз в строке? Имеет ли смысл порядок регулярных выражений (например, если 'UNASSIGNED' существует в строке, будет ли он когда-либо найден или будет сначала соответствовать' ASSIGNED')?Вы должны упомянуть, что это gawk-specific из-за 3-го аргумента для match(). –

Смежные вопросы