AWK - найти минимальное значение каждой строки произвольного размера

У меня есть файл со строками как:

5 3 6 4 2 3 5
1 4 3 2 6 5 8
..

Я хочу получить минимум в каждой строке, поэтому, например, с приведенным выше вводом я должен получить:

min of first line:  2
min of second line: 1
..

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


person Vahid Mirjalili    schedule 20.03.2013    source источник
comment
самая сложная часть этого вопроса - не найти минимальное значение, распечатать эти " the first, the second, the third, the forth... text" :) удачи   -  person Kent    schedule 20.03.2013


Ответы (2)


Если вы не возражаете против вывода с использованием цифр вместо слов, вы можете использовать этот один вкладыш:

$ awk '{m=$1;for(i=1;i<=NF;i++)if($i<m)m=$i;print "min of line",NR": ",m}' file
min of line 1:  2
min of line 2:  1

Если вы действительно хотите считать в порядковых числах:

BEGIN {
    split("first second third fourth",count," ")
}
{
    min=$1
    for(i=1;i<=NF;i++)
    if($i<min)
        min=$i

    print "min of",count[NR],"line: \t",min
}

Сохраните это в script.awk и запустите так:

$ awk -f script.awk file
min of first line:    2
min of second line:   1

Очевидно, что это будет работать только для файлов до 4 строк, но просто увеличьте список порядковых номеров до максимального числа, которое, по вашему мнению, вам понадобится. Вы должны быть в состоянии найти список в Интернете довольно легко.

person Chris Seymour    schedule 20.03.2013
comment
Этот ответ работает хорошо, но возвращает пустое значение, если один из столбцов пуст. Это может быть исправлено '{m=$1;for(i=1;i<=NF;i++)if($i<m && $i!="")m=$i;print "min of line",NR": ",m, " values:", $0}' - person dalloliogm; 16.02.2017

Ваша проблема довольно проста. Все, что вам нужно сделать, это определить переменную min в части BEGIN вашего скрипта, и в каждой строке вам просто нужно выполнить простой C-подобный алгоритм для минимального элемента (установите первое поле как min, а затем выполните проверьте со следующим полем и так далее, пока не дойдете до последнего поля строки). Общее количество полей в строке будет вам известно благодаря переменной NF. Так что это просто вопрос написания цикла for. Как только цикл for будет полностью выполнен для строки, у вас будет минимальный элемент, и вы можете просто распечатать его.

person Community    schedule 20.03.2013
comment
О, извините, они были отдельными, когда я их писал. Строка 1: 5 3 6 4 2 3 5 Строка 2: 1 4 3 2 6 5 8 Строка 3: 0,5 2 3 0,8 6 5 8 - person Vahid Mirjalili; 20.03.2013
comment
Ответ обновлен. Обратите внимание, что я не буду писать код для этого. - person ; 20.03.2013
comment
Спасибо, ваше предложение было достаточно хорошим awk '{min=$1; for(i=2;i‹=NF; i++) {if($i‹min){min=$i;}};printf%8.4f\n,min}' file.dat - person Vahid Mirjalili; 20.03.2013