Сортировать по столбцу и uniq по другому столбцу - PullRequest
0 голосов
/ 13 мая 2018

У меня есть таблица ниже, которая делится на ";" и сортируется как

Дата, имя, ID; область; Empty; CardNumber; температура

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

INPUT:

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

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

В 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
0 голосов
/ 13 мая 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
...