Хобрук: Ваш путь к мастерству в программировании

Получить максимальное абсолютное значение для каждой строки (awk)

У меня есть файл с несколькими строками и столбцами, разделенными табуляцией, например:

ID    v1        v2      v3     v4      v5     v6
A10  -0.2134  -0.190  -0.114  0.400  10.678 -0.123  
A115 -0.5038  -0.559  -0.664  0.431   0.139 -0.860    
AAAS -0.9072  -0.990  -1.251  3.153  -0.756  0.674 

Я хотел бы получить наивысшее абсолютное число из каждой строки и распечатать, если оно отрицательное или положительное, а также распечатать идентификатор заголовка из соответствующего столбца, например:

A10   10.678 v5  
A115  -0.860 v6    
AAAS  3.153  v4 

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

 awk  'NR>1{a=0; b=0; for (i=1;i<=NF;i++) if ($i < a || i == 1)a = $i; else if($i > b|| i == 1)b = $i; print $1,a, b}' file

A10  -0.2134  10.678
A115 -0.860   0.431
AAAS -1.251   3.153
17.07.2020

  • Что следует напечатать, если 2 или более столбца имеют одинаковое абсолютное максимальное значение - первый такой идентификатор заголовка столбца или последний, или их список всех, или что-то еще? Пожалуйста, отредактируйте свой вопрос, указав свои требования для этого случая, и включите этот случай в свой образец ввода / вывода, чтобы мы могли увидеть, как это нужно обработать. 17.07.2020
  • Это хороший вопрос. Может быть, распечатать список с заголовками с одинаковыми значениями. Но я думаю, что не найду эту ситуацию, потому что это результаты SVM, и я должен получить только один столбец с наибольшим значением. Спасибо! 17.07.2020

Ответы:


1
$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR == 1 {
    split($0,hdrs)
    next
}
{
    maxVal = 0
    for (i=2; i<=NF; i++) {
        val = ($i >= 0 ? $i : - $i) + 0
        if ( val >= maxVal ) {
            maxVal = val
            maxFld = i
        }
    }
    print $1, $maxFld, hdrs[maxFld]
}

.

$ awk -f tst.awk file
A10     10.678  v5
A115    -0.860  v6
AAAS    3.153   v4

Если у вас может быть несколько максимальных значений, например:

$ cat file
ID      v1      v2      v3      v4      v5      v6
A10     -0.2134 10.678  -0.114  10.678  10.678  -0.123
A115    -0.5038 -0.559  0.860   0.431   0.139   -0.860
AAAS    -0.9072 -0.990  -1.251  3.153   -0.756  0.674

тогда приведенный выше сценарий напечатает идентификатор заголовка последнего максимального значения. Если вы хотите напечатать первый вместо этого, это очевидная тривиальная настройка, и если вместо этого вы хотите перечислить все связанные заголовки, тогда:

$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR == 1 {
    split($0,hdrs)
    next
}
{
    delete val2hdrs
    maxVal = 0
    for (i=2; i<=NF; i++) {
        val = ($i >= 0 ? $i : - $i) + 0
        if ( val >= maxVal ) {
            maxVal = val
            maxFld = i
            val2hdrs[val] = (val in val2hdrs ? val2hdrs[val] "," : "") hdrs[i]
        }
    }
    print $1, $maxFld, val2hdrs[maxVal]
}

.

$ awk -f tst.awk file
A10     10.678  v2,v4,v5
A115    -0.860  v3,v6
AAAS    3.153   v4
17.07.2020

2

почти то же самое

$ awk 'function abs(x) {return x>0?x:-x} 
       NR==1 {split($0,h); next} 
             {max=abs($2); mi=2; 
              for(i=3;i<=NF;i++) 
                if(max<(nm=abs($i))) 
                  {max=nm; mi=i}; 
              print $1,$mi,h[mi]}' file | column -t 

A10   10.678  v5
A115  -0.860  v6
AAAS  3.153   v4
17.07.2020
Новые материалы

Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

Структуры данных в C ++ - Часть 1
Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

Как я опубликовал свое первое приложение в App Store в 13 лет
Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

Что в лицо
Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

Почему шаблоны проектирования и почему нет?
Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

Создание дизайна обуви с помощью машинного обучения
Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

GraalVM в 2022 году: итоги года
2022 год был очень продуктивным для проекта и сообщества GraalVM. Вместе мы разработали множество новых функций, выпустили GraalVM для последних версий Java и новых платформ и увидели несколько..