Сортировка минимального значения для каждого повторного имени

Нет вызова метода, если это то, о чем вы просите. С небольшими исследованиями, я полагаю, вы могли бы написать свои собственные. Конкретный экземпляр имеет фиксированный размер, полученный из числа ссылок и примитивных значений, а также учетных данных экземпляра. Вы просто будете ходить по графу объектов. Чем меньше типов строк, тем легче.

Если это слишком медленно или просто больше проблем, чем это стоит, всегда есть хорошее старомодное правило подсчета строк.

0
задан Tatt Ehian 16 January 2019 в 08:42
поделиться

3 ответа

Еще один awk:

$ awk '!($1 in a)||a[$1]>$2{a[$1]=$2}END{for(i in a)print i,a[i]}' file

Вывод:

May -0.45623
Peter 0.08234
Joe 0.88765
Wilson -0.88341

Объяснено:

$ awk '
!($1 in a) || a[$1]>$2 {  # if the key (name) has not yet been seen or its value is smaller
    a[$1]=$2              # store it to hash a
}
END {                     # after processing all the records
    for(i in a)           # go thru the stored keys
        print i,a[i]      # print them and their value
}' file
0
ответ дан James Brown 16 January 2019 в 08:42
поделиться

Без бесполезного cat или бесполезного sort и с исправленной ошибкой,

awk '!($1 in min) || $2<min[$1] { min[$1] = $2 }
    END { for (i in min) print i,min[i] }' aaa.txt

Ошибка в том, что неинициализированные элементы массива по умолчанию обнуляются, поэтому вы теряли те, которые имели положительный минимум.

Я сложил это для разборчивости; при желании вы можете удалить встроенную новую строку.

Если важно сохранить порядок, вы можете добавить второй массив, который отслеживает порядок появления ключей.

awk '!($1 in min) { k[++i] = $1; min[$1] = $2}
    $2<min[$1] { min[$1] = $2 }
END { for (j=1; j<=i; ++j) print k[j],min[k[j]] }' aaa.txt
0
ответ дан tripleee 16 January 2019 в 08:42
поделиться

Еще один способ, если порядок не является проблемой:

sort -k 1,1 -k 2n,2 file | awk '!_[$1]++'
0
ответ дан Guru 16 January 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: