Команда Unix uniq и сортировка

Как мы знаем

uniq [options] [file1 [file2]]

Он удаляет повторяющиеся соседние строки из отсортированного файла1. Опция -c печатает каждую строку один раз, считая экземпляры каждой. Итак, если у нас есть следующий результат:

     34 Operating System
    254 Data Structure
      5 Crypo
     21 C++
   1435 C Language
    589 Java 1.6

И мы сортируем вышеуказанные данные, используя «sort -1knr», результат выглядит следующим образом:

   1435 C Language
    589 Java 1.6
    254 Data Structure
     34 Operating System
     21 C++
      5 Crypo

Может ли кто-нибудь помочь мне, как вывести только название книги в этом порядке (без номера)?


person eleven    schedule 01.10.2012    source источник
comment
cut — волшебное слово (одно из них).   -  person Michael Krelin - hacker    schedule 01.10.2012
comment
Я думаю, что это не сработает, потому что перед номером несколько пробелов, как вы могли определить поле? Используя cut -d '' -f 2? Это ничего не вернет   -  person eleven    schedule 01.10.2012
comment
Например cut -c 9-, он проигнорирует число, но мы должны знать точное количество символов в столбце count   -  person eleven    schedule 01.10.2012
comment
Да, нам нужно знать ширину, чтобы использовать cut.   -  person Michael Krelin - hacker    schedule 01.10.2012
comment
вы имеете в виду -k1nr, а не -1knr, верно? также, спасибо за полезную команду!   -  person gatoatigrado    schedule 10.04.2013


Ответы (3)


Вы также можете использовать sed для этого следующим образом:

uniq -c filename | sort -k -1nr | sed 's/[0-9]\+ \(.\+\)/\1/g'

Контрольная работа:

echo "34 Data Structure" | sed 's/[0-9]\+ \(.\+\)/\1/g'
Data Structure

Это также можно сделать с помощью упрощенного регулярного выражения (любезно предоставлено Уильямом Перселлом):

echo "34 Data Structure" | sed 's/[0-9]* *//'
Data Structure
person Nelson    schedule 01.10.2012
comment
Это можно было бы значительно упростить: sed 's/[0-9]* *//g' - person William Pursell; 01.10.2012
comment
Действительно !, хотя тот, который вы разместили (со *), не работал в моих тестах, он работал с + , я добавляю это к своему ответу, спасибо :-) - person Nelson; 01.10.2012
comment
У вас не может быть флага g в упрощенной версии. Это погубило бы такие титулы, как 20000 лье под водой. (Моя ошибка в том, что я включил это; мышечная память быстро умирает.) - person William Pursell; 01.10.2012

Почему вы используете uniq -c для вывода количества вхождений, которые затем хотите удалить с помощью танца cut/awk/sed?

Вместо этого вы можете просто использовать

sort -u $file1 $file2 /path/to/more_files_to_glob*

Или некоторые системы поставляются с версией sort, которая не поддерживает -u?

person mivk    schedule 22.08.2018

person    schedule
comment
Как насчет того, чтобы не использовать команду awk? Используйте только uniq, sort, tr, wc, head, tail - person eleven; 01.10.2012
comment
Вы уже объяснили, почему cut не годится, в своем комментарии Михаилу Крелину. Вы можете использовать опцию -c, но я бы не хотел зависеть от точного количества символов в столбце счетчика. - person Barmar; 01.10.2012
comment
cut не годится, но это самый простой способ. Я нахожу это решение прекрасным и подходящим инструментом. Конечно, вы можете что-то сделать с while и read, но на самом деле awk как раз подходит для этой задачи. - person Michael Krelin - hacker; 01.10.2012