Intereting Posts
samba как отображать файлы с двоеточием в их имена? Как я могу загрузить ubuntu с внешнего жесткого диска, который подключен к малине Pi изменение разрешений ldd с 755 на неисполнение и обоснование безопасности Сценарий оболочки говорит о том, когда нужно выполнить в следующий раз как заменить знак минус на tr Синтаксис команды повторения в zsh Управление питанием openSuSE из командной строки Как интерпретировать первичную кеш-промахи: pp? Если поведение пустого условия Невозможно разобрать выходные данные awk Использование нескольких уровней модулей ядра для сопряжения аппаратного устройства? Беспроводная USB-клавиатура Raspberry Pi Linux + Solaris, как проверить последний процесс выполнения из списка процессов Отправка сигнала SIGINT для обработки при выполнении системного вызова или скрипта killall -SIGINT Выберите строки в одном файле на основе определенных значений во втором файле

найдите минимальное и максимальное значение в двух столбцах

У меня есть некоторые данные, которые выглядят так:

sampleA ATGC 10 100 sampleA ATGC 120 230 sampleA ATGC 200 110 

Я хочу напечатать min и max, используя значения в обоих столбцах 3 и 4. Поэтому мой вывод должен выглядеть так:

 sampleA 10 230 

заранее спасибо

Использование awk :

 awk 'BEGIN{getline; min=$3;max=$4} {(min>$3)?min=$3:"";(max>$4)?"":max=$4} END{print min, max}' infile.txt 

Выход:

 10 230 

Но я думаю, вы ищете что-то вроде ниже, чтобы найти min / max в пределах 2 Columns, а не min в 3-м столбце, а max в 4-м столбце – только как указано выше.

Пример ввода:

 sampleA ATGC 10 100 sampleA ATGC 300 2 sampleA ATGC 200 1100 sampleA ATGC 2301 9 sampleA ATGC 12345 15 sampleA ATGC 235 7 

Команда:

 awk 'BEGIN{getline;min=max=$3; ($4>$3)?max=$4:min=$4} { ($3>$4 && min>$4)?min=$4:((min>$3)?min=$3:""); ($3>$4 && $3>max)?max=$3:((max<$4)?max=$4:""); } END{print min, max}' infile.txt 

Результатом будет:

 2 12345 

Короткое решение awk :

 awk '{ a[++c]=$3; a[++c]=$4 }END{ asort(a); print $1,a[1],a[length(a)] }' file 

Выход:

 sampleA 10 230 

Короткое решение datamash (для отдельного расчета min / max в 3-й / 4-й колонках):

 datamash -W -g1 min 3 max 4 < file 
  • -g1 – групповые записи по значению 1-го столбца

  • min 3 – получить минимальное значение на 3-й колонке

  • max 4 – получить максимальное значение на 4-й колонке

Выход:

 sampleA 10 230 
 NF == 4 { if (++totalSamples == 1) { sampleName = $1 minValue = $3; maxValue = $3; } else { if ($3 < minValue) minValue = $3 else if ($3 > maxValue) maxValue = $3 } if ($4 < minValue) minValue = $4 else if ($4 > maxValue) maxValue = $4 } END { if (totalSamples) printf("%s %d %d\n", sampleName, minValue, maxValue) }