Как распечатать элемент из соответствующего непосредственного следующего столбца после поиска элемента в текущем столбце?

Вы смешиваете классы символов с субпотрубными. Здесь нужен последний:

grep -E '201411(08|09|10|11)-(117|111)-' file

«Класс символов» означает: каждый черный символ из класса (вроде [[[: ALPHA:]] [) или выделение ([01][8901]) может появиться.

«SubPattern» (с | ) означает: «один из шаблонов, разделенных |

0
31.03.2015, 05:17
2 ответа

В соответствии с образцами данных в вашем вопросе это то, что вам нужно (в противном случае уточните ваш вопрос, пожалуйста):

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 все еще неопределенным?". (т.е. еще не присвоено значение).

2
28.01.2020, 02:36

Вот несколько решений.

Двухпроходный (без массива):

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) ).

0
28.01.2020, 02:36

Теги

Похожие вопросы