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

Возможно, я нашел свой собственный ответ:

https://stackoverflow.com/questions/36998143/alternative-way-to-obtain-argc-and-argv-of-a-process

__attribute__((constructor)) void stuff(int argc, char **argv)
{
    for (int i=0; i

Конечно, остается проблема с пропуском аргументов, IE, вы можете просмотреть аргументы, но основная ()программа завершится ошибкой, когда обнаружит, что аргументы вашей библиотеки смешаны со своими собственными.

4
26.03.2021, 16:33
2 ответа

Весь ваш awk-скрипт можно упростить до этого:

awk 'max<$5 || NR==1{ max=$5; data=$2 } END{ print data }' infile

или "сохранить все строки второго столбца с одинаковыми максимальными значениями" в 5 ом столбце:

awk 'max<$5 || NR==1 { max=$5; data=$2; next }
     max==$5{ data= data ORS $2 }
END{ print data }' infile

О вашем собственном скрипте, который вы написали таким образом, вам нужно дважды обработать входной файл, первый процесс находит максимальное значение, второй процесс печатает второй столбец строк, имеющих это максимальное значение, что-то вроде этого:

awk 'function max(val1, val2){
        if (val1 > val2)
                return val1
        else
                return val2
}

BEGIN { largest = 0 }

NR==FNR{ largest = max(largest,$5 + 0); next }
$5==largest { print $2 }' infile infile
8
28.04.2021, 22:55

Ваш вопрос интерпретируется как

Find the max value in column 5, then print all values in column 2 that have that max value.

awk '
    NR == FNR {
        if (FNR == 1 || $5 > max) max = $5
        next
    }
    $5 == max {print $2}
' file file

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

4
28.04.2021, 22:55

Теги

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