Сортировать по столбцу и uniq по другому столбцу

У меня есть таблица ниже, которая разделена с помощью ";" и отсортирована как

Дата;Имя;ID;Регион;Пусто;Номер карты;Температура

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

ВХОД:

1999;D;153;RIZE;;LT1;86
2013;D;153;RIZE;;LT2;88
2012;D;153;RIZE;;LT3;9
2011;D;153;RIZE;;LT4;81
2010;D;153;RIZE;;LT1;75
1888;D;153;RIZE;;LT2;76
2008;D;153;RIZE;;LT3;77
2006;D;153;RIZE;;LT4;78

ВЫХОД:

2013;D;153;RIZE;;LT2;88
1999;D;153;RIZE;;LT1;86
2011;D;153;RIZE;;LT4;81
2008;D;153;RIZE;;LT3;77

Я попробовал команду ниже, но дал нерелевантный результат. С уважением.

sort -t ';' -rnk 7 sil3 | sort -u -t ';' -rk 2,6
2011;D;153;RIZE;;LT4;81
2012;D;153;RIZE;;LT3;9
2013;D;153;RIZE;;LT2;88
2010;D;153;RIZE;;LT1;75

person Eyvz    schedule 13.05.2018    source источник


Ответы (2)


В GNU awk:

$ gawk '
BEGIN { FS=OFS=";" }
                      # { k=$2 FS $3 FS $4 FS $6 }
$7>t[$6] {            # $7>t[k] {
    t[$6]=$7          #     t[k]=$7
    r[$6]=$0          #     r[k]=$0
}
END {
    PROCINFO["sorted_in"]="@val_num_desc"
    for(i in t)
        print r[i]
}' file
2013;D;153;RIZE;;LT2;88
1999;D;153;RIZE;;LT1;86
2011;D;153;RIZE;;LT4;81
2008;D;153;RIZE;;LT3;77

Если у вас нет GNU awk, отсортируйте вывод с помощью sort:

$ awk '
BEGIN { FS=OFS=";" }
$7>t[$6] {
    t[$6]=$7
    r[$6]=$0
}
END {
    for(i in t)
        print r[i]
}' file |
sort -s -t \; -k7nr 
2013;D;153;RIZE;;LT2;88
1999;D;153;RIZE;;LT1;86
2011;D;153;RIZE;;LT4;81
2008;D;153;RIZE;;LT3;77
person James Brown    schedule 13.05.2018
comment
Спасибо, это сработало, но если есть больше строк с разными параметрами, это не работает. Идея состоит в том, чтобы найти уникальные имена, и каждое имя может иметь более 1 карты, команда должна найти уникальные карты имени и отсортировать по температуре. - person Eyvz; 13.05.2018
comment
Я не понимаю. Пожалуйста, разместите отражающие образцы данных с ожидаемым результатом. - person James Brown; 13.05.2018
comment
Если вам нужно больше параметров, добавьте их в ключи массива, например: t[$2 FS $6]=$7. - person James Brown; 13.05.2018
comment
Фактический ввод будет очень длинным, и будет много разных имен, идентификаторов, регионов и т. д., поэтому параметры непредсказуемы. Вот почему я попробовал sort -u -t ';' -рк 2,6 - person Eyvz; 13.05.2018
comment
Поместите все необходимые параметры в ключи массива. Я полагаю, что это будет делать: { k=$2 FS $3 FS $4 FS $6 } $7>t[k] { t[k]=$7; r[k]=$0 } - person James Brown; 13.05.2018
comment
Вау, это действительно сработало идеально после добавления строки. Так что это невозможно сделать только с сортировкой, я думаю. - person Eyvz; 13.05.2018
comment
Что ж, если вы переупорядочили временный файл во второй столбец, использовали разделитель пробелов (т.е. использовали awk для обоих предыдущих), sorted для временного файла и использовали uniq -f 2, тогда, возможно. - person James Brown; 13.05.2018

Следование awk может помочь вам в этом (в системе Solaris/SunOS измените awk на /usr/xpg4/bin/awk , /usr/xpg6/bin/awk или nawk)

awk -F";" '{a[$(NF-1)]=a[$(NF-1)]>$NF?a[$(NF-1)]:$NF;b[$(NF-1)]=$0;b[$(NF-1),$NF]=$0} END{for(i in a){print b[i,a[i]]}}'   Input_file
person RavinderSingh13    schedule 13.05.2018
comment
@Eyvz, как я уже упоминал, если ваша система — ОС Sun, то, следуя инструкциям в моем посте, простой awk на ней не сработает. Попробуйте nawk или /usr/xpg6/bin/awk в нем? - person RavinderSingh13; 13.05.2018
comment
Да, спасибо, спасибо, но у меня будет много параметров с длинным вводом, команда не подходит для такого длинного списка. - person Eyvz; 13.05.2018