Используя проклятия с консолью Linux

Я просто приехал сюда с подобной проблемой. От этого мне удалось соединить немного более усовершенствованную команду, которая я надеюсь, полезно для других.

Как Steven D сказал в комментариях выше uniq только считает смежные повторные строки, таким образом, необходимо отсортировать строки сначала. После этого мы находим уникальные строки затем видом снова так, большинство строк появления находится на вершине.

sort file.txt | uniq -c | sort -nr > output.txt

Вывод перенаправляется в файл output.txt. Если Вы просто хотите просмотреть результаты на командной строке, удалить перенаправление и изменить последнюю команду на sort -n так, чтобы наиболее распространенная строка была внизу, т.е. определенно все еще на экране.

6
09.09.2015, 15:43
2 ответа

От ncurses FAQ http://invisible-island.net/ncurses/ncurses.faq.html

Тянущие строку символы выходят как x's и q's

x's и q's соответствуют таблице (от terminfo/termcap), который говорит ncurses, как отобразить "альтернативный" набор символов на набор терминала графических символов. Ссылка для этой таблицы прибывает из vt100. Если неотображаемые символы появляются, то эмулятор терминала не распознает escape-последовательность для переключения между нормальными и альтернативными шрифтами, которое дано в terminfo описании.

Существует несколько знаменитых случаев:

  • Эмуляторы терминала, которые используют другую escape-последовательность или другой диапазон для отображения получающихся символов. Например, так называемые vt100-совместимые-устройства, такие как консоль Linux и Термин Tera.
  • Эмуляторы терминала, которые чувствительны к локали. Снова, консоль Linux является проблемной областью при выполнении в режиме UTF-8, так как его номинальная vt100-совместимость далее уменьшена путем игнорирования escape-последовательностей, имеющих дело со шрифтами. Экранная утилита также имеет ту же проблему; сделать ли реализацию простой или скопировать консоль Linux, она игнорирует переключение шрифтов vt100-стиля, когда локаль является разновидностью UTF-8.
  • Если Вы, оказывается, используете Солярис, он часто настраивается для предпочтения его терминальной базы данных ncurses, даже когда ncurses установлен. Однако его терминальное описание для xterm опускает enacs, который используется для включения рисования строки. Это не работает хорошо с приложениями, такими как экран и luit.

Для первого случая просто необходимо найти корректное terminfo описание. Фиксация последнего более трудна, так как ущерб нанесен снаружи ncurses. (Хотя можно легко сделать вещи достаточно совместимыми, что эта конкретная проблема никогда не появлялась бы, тот стиль решения не считают надлежащим некоторые кодеры).

Нормальные ncurses библиотеки поддерживают 8-разрядные символы. ncurses библиотека может также быть настроена (-включают-widec) поддерживать широкие символы (например, Unicode и кодировка UTF-8). Соответствующий широкий символ ncursesw библиотеки совместим с источником с нормальными приложениями. Таким образом, приложения должны быть скомпилированы и связаны против ncursesw библиотеки.

Выпуск ncurses 5.3 оказывает поддержку UTF-8. Особые случаи консоли Linux и экрана были обращены в патчах разработки, завершенных в конце 2002.

2
27.01.2020, 20:29

Хороший ответ начинается с объяснения проблемы своими словами, затем выборочно цитируются части, которые имеют отношение к делу. В разделе FAQ по ncurses, представленном @Craig, есть аспект, не описанный подробно, который помогает понять вопрос.

Ссылаясь на раздел Line Graphics страницы руководства terminfo(5) и соответствующий раздел Line Graphics страницы руководства curs_add(3x), библиотека curses имеет предопределенный набор символьных констант с именем ACS_xxxx, которые на различных терминалах рисуются с помощью аналогичных управляющих последовательностей.

Наиболее распространенный вариант основан на VT100, где приложение посылает специальный символ (или управляющую последовательность) для запуска режима линейной графики mode и другой символ (или управляющую последовательность) для завершения линейной графики.

Несколько разработчиков эмуляторов терминалов возражали против понятия режимов при написании текста в режиме UTF-8. Не обращайте внимания на иронию (для запуска/остановки кодировки UTF-8 существуют управляющие последовательности), но в ncurses эта функция поддерживается достаточно эффективно. Чтобы помочь ему решить, как делать построчную графику,

  • он начинает с описания терминала (определяемого переменной окружения), которое может сказать только, как делать построчную графику в стиле VT100.
  • Для UTF-8 он может проверить кодировку локали, проверив другие переменные окружения.

Если ncurses должен использовать только UTF-8 (потому что терминал не поддерживает линейную графику VT100), он использует встроенную таблицу достаточно хороших значений Unicode. Рисование линий с помощью UTF-8 неизбежно в три раза медленнее, чем при использовании линейной графики VT100, просто потому, что на терминал посылается в три раза больше символов.

Все это делает рисование линий UTF-8 "тоже", а не основной задачей библиотеки. В случае OP что-то (вероятно, переменные локали) было неправильно. Fedora инициализировала консоль в режиме UTF-8, а консоль Linux - хорошо известный случай, в котором отсутствует построчная перерисовка VT100, ОП получил странные символы на экране.

Поскольку ncurses интерпретировал среду OP как поддерживающую возможности в описании терминала, он переключился в режим рисования строк VT100 (игнорируемый консолью из-за переопределения режима) и нарисовал символы, которые, как он ожидал, будут отображаться в строки. Поэтому на экране могло появиться следующее:

lqqqqqqqqqqqqqqqk
x  Hello world  x
mqqqqqqqqqqqqqqqj 

а не

┌───────────────┐
│  Hello world  │
└───────────────┘
2
27.01.2020, 20:29

Теги

Похожие вопросы