Возьмите максимальное значение из столбца и извлеките все строки с не менее чем 20% этого значения

Я хотел бы найти максимальное значение столбца B и сохранить все строки, где значения столбца B составляют 20% или более от максимального.

ВХОДНЫЕ ДАННЫЕ

ABCDE 2 79 56 SD L 1 09 67 JK S 9 60 37 KD G 0 10 47 SO E 

ЖЕЛАТЕЛЬНЫЙ ВЫХОД

 ABCDE 2 79 56 SD L 9 60 37 KD G 

Я попытался использовать awk 'BEGIN {max = 0} {if ($2>max) max=$2} END {if ($2 >= (0.1*max)) print}' file_in > file_out но это только печатает то, что кажется быть последней строкой моего файла.

2 Solutions collect form web for “Возьмите максимальное значение из столбца и извлеките все строки с не менее чем 20% этого значения”

Вам нужно сохранить все строки в массиве, чтобы снова пройти их через END{ } . Или, наоборот, дважды сканируйте файл. Таким образом, сохраняя все значения и строки:

 awk 'NR == 1 {header=$0; next} # save the header { lines[NR] = $0; values[NR] = $2; # save the line and 2nd field if ($2 > max) max = $2; } # update max END { print header; # in the end, print the header for (i = 1 ; i <= NR ; i++) { # (we skipped line 0) if (values[i] >= max * 0.2) # print lines where $2 was high enough print lines[i]; } } ' file_in 

С мельником :

1) Довольно печатные данные:

 $> mlr --from data --ipprint --otsv cat ABCDE 2 79 56 SD L 9 60 37 KD G 

2) Добавьте максимум поля B в поле B_max :

 $> mlr --from data --ipprint --otsv stats1 -a max -f B -s -F ABCDE B_max 2 79 56 SD L 79.000000 1 09 67 JK S 79.000000 9 60 37 KD G 79.000000 0 10 47 SO E 79.000000 

3) Линии фильтра, где B >= B_max * 0.2 :

 $> mlr --from data --ipprint --otsv stats1 -a max -f B -s -F then filter '$B >= $B_max*0.2' ABCDE B_max 2 79 56 SD L 79.000000 9 60 37 KD G 79.000000 

4) Затем снова cut B_max :

 $> mlr --from data --ipprint --otsv stats1 -a max -f B -s -F then filter '$B >= $B_max*0.2' then cut -x -f B_max ABCDE 2 79 56 SD L 9 60 37 KD G 
  • Ошибка при поиске строки в файле
  • Как я могу использовать цикл внутри команды?
  • Почему лучше использовать «#! / Usr / bin / env NAME» вместо «#! / Path / to / NAME» в качестве моего shebang?
  • Сценарий оболочки, выполняемый в терминале, но не из файла сценария оболочки
  • Как создать кучу файлов с разными параметрами в теле каждого файла?
  • Запретить выполнение в домашнем каталоге
  • Добавление содержимого в файл дает отказ в разрешении
  • Обновление файлов конфигурации в скрипте, который ссылается на них?
  • Сценарий Bash для обнаружения загруженных файлов триггеров много раз для одного файла
  • Массовое переименование и изменение размера с помощью Imagemagick
  • Хранение сценариев оболочки
  • Linux и Unix - лучшая ОС в мире.