Команда Unix uniq, sort & cut удаляет повторяющиеся строки

Если мы имеем следующий результат:

Operating System,50
Operating System,40
Operating System,30
Operating System,23
Data Structure,87
Data Structure,21
Data Structure,17
Data Structure,8
Data Structure,3
Crypo,33
Crypo,31
C++,65
C Language,39
C Language,19
C Language,4
Java 1.6,16
Java 1.6,11
Java 1.6,10
Java 1.6,2

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

Operating System,50
Data Structure,87
Crypo,33
C++, 65
C Language,39
Java 1.6,16

Может ли кто-нибудь помочь мне, как я могу использовать команду uniq, sort & cut? Можно использовать tr, head или tail?


person eleven    schedule 01.10.2012    source источник
comment
вроде sort -u -t, -k2nr, но не работает   -  person eleven    schedule 01.10.2012


Ответы (3)


Если ваш ввод отсортирован, вы можете использовать GNU awk следующим образом:

awk -F, '!array[$1]++' file.txt

Полученные результаты:

Operating System,50
Data Structure,87
Crypo,33
C++,65
C Language,39
Java 1.6,16

Если ваш ввод не отсортирован, вы можете использовать GNU awk следующим образом:

awk -F, 'FNR==NR { if ($2 > array[$1]) array[$1]=$2; next } !dup[$1]++ { if ($1 in array) print $1 FS array[$1] }' file.txt{,}

Полученные результаты:

Operating System,50
Data Structure,87
Crypo,33
C++,65
C Language,39
Java 1.6,16
person Steve    schedule 03.10.2012

Наиболее элегантным в этом случае может показаться

rev input | uniq -f1 | rev
person sehe    schedule 03.10.2012

Это можно сделать по-разному, но я попытался ограничиться предложенными вами инструментами:

cut -d, -f1 file | uniq | xargs -I{} grep -m 1 "{}" file

В качестве альтернативы, если вы уверены, что слова в первом столбце не содержат более 2 одинаковых символов, вы можете просто использовать: uniq -w3 file. Это говорит uniq сравнивать только первые три символа.

person dogbane    schedule 01.10.2012
comment
нет, без xargs нельзя. Вам нужен способ неоднократно вызывать grep. Другим вариантом было бы использование цикла. - person dogbane; 01.10.2012