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 Solutions collect form web for “uniq показывает повторяющиеся строки”

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

В строке выше указаны 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 вы получите следующее приглашение оболочки в той же строке, что и текст, без перерыва линии.

  • Разница между винами и крыльями?
  • Окно установки окон Каталог пользователей как / home в виртуальной машине linux
  • Не удается загрузить окна после установки ubuntu
  • Как я могу управлять учетными записями пользователей Microsoft Windows из Linux?
  • Расширение раздела Linux, в котором есть свободное место
  • Почему переадресация портов не работает в QEMU?
  • Установлено CentOS, теперь нет параметров Windows 8 при перезагрузке
  • Не удается просмотреть список разделов Windows в Linux
  • Длительное время POST, установленное Linux. Зачем?
  • Безопасно ли запускать все из VirtualBox?
  • Шифрованная файловая система в VirtualBox
  • Interesting Posts

    Проверка оболочки рыбы для существования файла в $ PATH

    запуск docker всегда терпит неудачу с «нет такого файла или каталога»

    Arch Linux – make: ошибка при загрузке разделяемых библиотек: libunistring

    Звук Linux звучит при копировании с USB-ключа

    Какие файловые системы требуют fsync () для защиты от сбоев при замене существующего файла на rename ()?

    Не удалось запустить графический интерфейс

    Программное обеспечение для создания позиции в шахматном формате

    kvm – как использовать USB в качестве хранилища

    Почему переадресация портов через захват libvirt с помощью внешнего NAT-трафика?

    Распределение структуры безопасности inode selinux

    LibreOffice представляет случайные разрывы страниц

    Как добавить псевдоним для моего pwd в существующий файл?

    Перенаправление на основе отправителя на Postfix

    Сохранение iptables в CentOS и объединение предыдущих правил с недавно сохраненными?

    Как сообщить systemd запустить sshd позже в последовательности загрузки?

    Linux и Unix - лучшая ОС в мире.