Intereting Posts
Заполнение имени переменной в ksh Использовать другую оболочку по умолчанию в каждом эмуляторе терминала Звук загадочно умер на рабочем столе Debian – как его вернуть? Создание цикла for в моем сценарии bash Как создать последовательно пронумерованные имена файлов в bash? Приветственный баннер, останавливающий scp Когда ни один сервер dhcp не отвечает, как заставить dhclient использовать статический лизинг из dhclient.conf вместо предыдущего аренды dhcp? Конфигурация Dual Head с двумя сенсорными экранами в Linux Есть ли инструмент для обобщения всех команд? Почему я вижу «Не удалось найти tools.jar. Ожидалось найти его в … », когда я запускаю ant (на RHEL 6.6), даже если путь установлен Настройте локальное время. dpkg-reconfigure tzdata Размер памяти для работы с ядром ядра zsh HISTFILE – все еще читается из ~ / .zsh_history Создание файла jks, а затем его проверка Проблема с драйверами видеокарты в Debian (AMD Radeon R5 M330)

uniq показывает повторяющиеся строки

$ grep home american.txt | sort | uniq A home and a country should leave us no more! Between their loved home and the war's desolation! O'er the land of the free and the home of the brave! O'er the land of the free and the home of the brave! O'er the land of the free and the home of the brave? 

Почему это показывает две повторяющиеся строки?

Вот результат grep home american.txt | cat -A grep home american.txt | cat -A :

 O'er the land of the free and the home of the brave?^M$ O'er the land of the free and the home of the brave!^M$ A home and a country should leave us no more! ^M$ O'er the land of the free and the home of the brave!^M$ Between their loved home and the war's desolation!^M$ O'er the land of the free and the home of the brave!$ 

О, земля свободного и дом храбрых!

В строке выше указаны 3 строки. В первых двух случаях оба имеют возврат каретки в конце. Третье вхождение нет. вы можете использовать следующую команду для визуализации:

cat -A american.txt

Это связано с тем, что в этом текстовом файле отсутствует пустая строка в конце.
Я думаю, что соглашение в мире Unix / Linux всегда имеет пустую строку в конце текстовых файлов.

Некоторые другие вещи, которые я нашел интересными, пока я тестировал это:

  • команда работает по-разному в cygwin.
  • grep home american.txt | sort| uniq -u grep home american.txt | sort| uniq -u работает отлично.

Как подозревают Дэвид Дай и cas, две линии на самом деле разные, но единственное различие заключается в невидимых персонажах.

Ваш файл является текстовым файлом Windows. В текстовых файлах Windows строки разделяются двухсимвольной последовательностью CR, LF (возврат каретки, подача строки). В текстовом файле Unix строки заканчиваются символом LF (строка, также называемая символом новой строки). cat -A показывает CR как ^M и строку в качестве $ за которой следует разрыв строки.

Когда текстовый файл Windows обрабатывается утилитой Unix, утилита Unix видит дополнительный символ CR в конце каждой строки. Что касается утилит Unix, CR – обычный символ; линия с CR на конце отличается от линии, которая идентична, за исключением отсутствия CR в конце. Кроме того, в Windows последовательность строк новой строки является разделителем, поэтому в конце файла отсутствует CR, LF. Но в Unix текстовый файл всегда заканчивается символом LF, если он не пуст. Поэтому, когда вы обрабатываете текстовый файл Windows с помощью утилиты Unix, то, что видит утилита Unix, представляет собой файл с CR в конце каждой строки (поскольку символы CR не являются частью кодировки Unix новой строки) и некоторый задний текст который не является частью строки (из-за отсутствия новой строки в конце).

Утилиты текстового редактора Unix отличаются тем, что они делают, когда их ввод не является допустимым текстовым файлом из-за отсутствия окончательной новой строки. Утилиты GNU – это то, что вы найдете на не встроенных Linux и на Cygwin – старайтесь обрабатывать такие файлы, как текстовый файл, и сохраняете отсутствие окончательной новой строки. Команда sort перемещает строки вокруг, и пока она обрабатывает незавершенную строку ввода, она всегда испускает новую строку в конце вывода. Таким образом, в команде sort вы выглядите как пучок строк, каждый из которых заканчивается символом CR, за исключением последней строки ввода, которая не заканчивается CR. На выходе все линии заканчиваются CR, за исключением одной строки, соответствующей последней строке ввода.

uniq видит кучу строк, которые заканчиваются brave! и CR, и сохраняет только один из них. Он также видит одну линию, которая заканчивается brave! но нет CR, который он покорно излучает, поскольку эта линия отличается от любой другой линии.

Когда вы распечатываете вывод на терминале, символ CR указывает терминалу переместить курсор в начало текущей строки; символ LF указывает терминалу переместить курсор в начало следующей строки. Таким образом, последовательности LF и CR, LF не визуально различимы, и вы видите две одинаково выглядящие линии. Команда cat -A добавляет печатные символы, чтобы сделать их отличными.

Одна из этих строк заканчивается brave! имеет возврат каретки ( ^M ), другой – нет. uniq прав, они разные.

Все строки в файле, кроме самого последнего, имеют возврат каретки. Он имеет их, потому что он был создан текстовым редактором MS-DOS или Windows (который использует CR / LF для строк, а не unixish LF-only или \ n). Последняя строка в файле не имеет CR или LF (в противном случае под ним должна быть пустая строка).

Вот почему, например, если вы tail -1 american.txt вы получите следующее приглашение оболочки в той же строке, что и текст, без перерыва линии.