2013-03-20 2 views
1

У меня есть файл с линиями, как: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 для любого произвольного количества столбцов в каждой строке?

+0

самая сложная часть этого вопроса не находит минимальное значение, печатает те «первый, второй, третий, четвертый ... текст» ':) удачи – Kent

ответ

4

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

$ 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 строк, но просто увеличивайте список порядковых номеров до максимального числа, которое, по вашему мнению, вам понадобится. Вы должны быть в состоянии найти список онлайн довольно легко.

+0

Этот ответ работает хорошо, но возвращает пустое значение, если один из столбцов пуст. Это можно зафиксировать с помощью '' '' {m = $ 1; for (i = 1; i <= NF; i ++), если ($ i dalloliogm

1

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

+0

О, извините, они были когда я их написал. Строка 1: 5 3 6 4 2 3 5 Строка 2: 1 2 3 4 5 6 8 Строка 3: 0,5 2 3 0,8 6 5 8 –

+0

ответа обновляется. Обратите внимание, что я не буду писать код для этого. – 2013-03-20 14:33:54

+0

+1 для вашего ответа и комментария выше! – Kent

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