Вы смешиваете классы символов с субпотрубными. Здесь нужен последний:
grep -E '201411(08|09|10|11)-(117|111)-' file
«Класс символов» означает: каждый черный символ из класса (вроде [[[: ALPHA:]] [
) или выделение ([01][8901]
) может появиться.
«SubPattern» (с |
) означает: «один из шаблонов, разделенных |
.»
В соответствии с образцами данных в вашем вопросе это то, что вам нужно (в противном случае уточните ваш вопрос, пожалуйста):
awk '$5 > max { max = $5 ; out = $0 } END { print out }' datafile
Это выведет ту строку в файле данных, где значение в 5-ом столбце является максимальным.
Программа работает следующим образом: Для каждой строки элемент пятого столбца сравнивается с сохраненным максимумом max
(который изначально равен 0), и если найдено большее значение max
получает это значение (для последующих сравнений), а текущая строка ($0
), содержащая максимум, записывается в переменную out
. В качестве конечного действия программы будет выведено значение переменной out
.
В случае, если в Ваших данных есть только значения меньше нуля, Вам потребуется (из-за неявной инициализации max
с нулем) некоторое расширение; часто достаточно явно инициализировать переменную max
значением, известным как меньшее, чем значения в Ваших данных, e. например, используя BEGIN { max = -999999 }
, но можно также использовать общий шаблон кода следующим образом:
awk '(max==0 && max=="") || $5 > max { max = $5 ; out = $0 } END { print out }' datafile
Считайте часть условия (max==0 && max==")
следующим образом:
awk '(max==0 && max=="") || $5 > max { max = $5 ; out = $0 } END { print out }' datafile
Считайте часть условия (max==0 && max==")
: "Является ли max
все еще неопределенным?". (т.е. еще не присвоено значение).
Вот несколько решений.
awk '
{
if (NR == FNR) {
if ($5 > max) max = $5
} else {
if ($5 == max) print
}
}' textfile textfile
NR
- это номер записи (номер строки), подсчитанный для всего ввода.
FNR
- это номер строки в текущем файле .
Так, например, если вы запускаете awk
с вводом из двух файлов:
fileC
, который состоит из трех строк, и fileD
, что составляет четыре строки,
NR
и FNR
будут принимать следующие значения:
NR FNR
1 1 { {1}} 2 2
3 3
4 1
5 2
6 3
7 4
Итак тестирование NR == FNR
- классический трюк для определения
, просматриваете ли вы первый файл.
текстовый файл
был указан дважды?).
Если на первом проходе найдено максимальное значение;
на втором проходе печатаются все строки, содержащие это значение. awk '
{
if ($5 >= max) {
if ($5 > max) {
max = $5
delete result
count = 0
}
result[++count] = $0
}
}
END { for (i = 0; i <= count; i++) print result[i] }' textfile
result
. Это сложно,
потому что мы не знаем максимальное значение, пока не пройдем весь путь
через файл (поскольку мы читаем файл только один раз).
Итак, всякий раз, когда мы встречаем значение, которое выше
, чем любое из тех, что мы видели раньше (т. Е. Находим новый максимум),
мы удаляем ( delete
) массив result
и начать заново. Примечание. Приведенные выше команды завершаются ошибкой, если каждое значение в пятом столбце ≤ 0.
Чтобы обработать этот случай, измените if ($ 5>…
на ] if (max == "" || $ 5>…
на всем протяжении
(включая тест if ($ 5> = max)
).