BASH Как получить минимальное значение из каждой строки

#bash #sorting #awk #rowsorter

#удар #сортировка #awk #сортировщик рядов

Вопрос:

У меня есть csv-файл, такой как этот:

 -0.106992, -0.106992, -0.059528, -0.059528, -0.028184, -0.028184, 0.017793, 0.017793, 0.0, 0.220367 -0.094557, -0.094557, -0.063707, -0.063707, -0.020796, -0.020796, 0.003707, 0.003707, 0.200767, 0.200767 -0.106038, -0.106038, -0.056540, -0.056540, -0.015119, -0.015119, 0.032954, 0.032954, 0.237774, 0.237774 -0.049499, -0.049499, -0.006934, -0.006934, 0.026562, 0.026562, 0.067442, 0.067442, 0.260149, 0.260149 -0.081001, -0.081001, -0.039581, -0.039581, -0.008817, -0.008817, 0.029912, 0.029912, 0.222084, 0.222084 -0.046782, -0.046782, -0.000180, -0.000180, 0.030788, 0.030788, 0.075928, 0.075928, 0.266452, 0.266452 -0.082107, -0.082107, -0.026791, -0.026791, 0.001874, 0.001874, 0.052341, 0.052341, 0.249779, 0.249779  

введите описание изображения здесь

Я хочу получить минимальное значение из каждой строки.

Ожидаемый результат должен быть:

-0.106992

-0.094557

-0.106038

-0.049499

-0.08100

-0.046782

-0.082107

Я попытался получить его с помощью awk, но awk не дает минимальных значений:

команда awk:

 awk '{m=$1; for (i=2; ilt;=NF; i  ) if ($i lt; m) m = $i; print m}' file_name  

выход:

-0.028184,

-0.020796,

-0.015119,

-0.006934,

-0.008817,

-0.000180,

-0.026791,

Комментарии:

1. вы забыли добавить -v FS=', ' в свою awk команду

Ответ №1:

Perl быстро справляется с этим:

 perl -MList::Util=min -F', ' -E 'say min @F' file.csv  
 -0.106992 -0.094557 -0.106038 -0.049499 -0.081001 -0.046782 -0.082107  

Ответ №2:

Использование любого awk в любой оболочке в каждом окне Unix независимо от того, есть ли у вас пробелы после каждой запятой или нет:

 $ awk -F', *' '{min=$1; for (i=2;ilt;=NF;i  ) if ($ilt;min) min=$i; print min}' file -0.106992 -0.094557 -0.106038 -0.049499 -0.081001 -0.046782 -0.082107  

Ответ №3:

с руби 😀

 ruby -F', ' -ane 'puts $F.map(amp;:to_f).min' file.csv  

Ответ №4:

Ваш код верен:

 awk '{m=$1; for (i=2; ilt;=NF; i  ) if ($i lt; m) m = $i; print m}' file_name  

За исключением того, что вы должны добавить запятую в разделитель полей:

 awk -F '[[:blank:],]' '{m=$1; for (i=2; ilt;=NF; i  ) if ($i lt; m) m = $i; print m}' file_name  

[[:blank:],] это пробелы, табуляции и запятые.