Двойная строка box_drawing символы в терминале

Я предлагаю sed решение, но ради полноты,

awk 'NR >= 57890000 && NR <= 57890010' /path/to/file

Отключать после последней строки:

awk 'NR < 57890000 { next } { print } NR == 57890010 { exit }' /path/to/file

Тест скорости (здесь на macOS, YMMV в других системах):

  • Файл с 100,000,000 строками, сгенерированный seq 100000000 > test.in
  • Чтение строк 50 000 000-50 000 010
  • Тесты без определенного порядка
  • real время, как сообщается bashвстроенный time
 4.373  4.418  4.395    tail -n+50000000 test.in | head -n10
 5.210  5.179  6.181    sed -n '50000000,50000010p;57890010q' test.in
 5.525  5.475  5.488    head -n50000010 test.in | tail -n10
 8.497  8.352  8.438    sed -n '50000000,50000010p' test.in
22.826 23.154 23.195    tail -n50000001 test.in | head -n10
25.694 25.908 27.638    ed -s test.in <<<"50000000,50000010p"
31.348 28.140 30.574    awk 'NR<57890000{next}1;NR==57890010{exit}' test.in
51.359 50.919 51.127    awk 'NR >= 57890000 && NR <= 57890010' test.in

Это ни в коем случае не точные сравнительные тесты, но различие является четким и достаточно повторяемое* для предоставления хорошего чувства относительной скорости каждой из этих команд.

*: Кроме между первыми двумя, sed -n p;q и head|tail, которые, кажется, по существу то же.

1
08.09.2013, 01:36
2 ответа

Какой набор символов у Вас есть свой набор терминала к использованию? При тихом использовании ASCII Вы не имеете символы рисования поля двойной строки в наличии для Вас. При использовании UTF-8 можно отослать последовательность символов UTF-8 для этих символов. Я верю printf("╢") будет работать, если Вы компилятор примете UTF-8 в исходном коде, например. gcc с -finput-charset=UTF-8.

2
27.01.2020, 23:29
  • 1
    printf (" ╢ ") работы. Но печатая его со строкой как \e (0\x78\e (B лучше, если существует кто-либо. –   07.09.2013, 19:41
  • 2
    , "не может быть распечатан", Вы имеете в виду, когда Вы пытаетесь распечатать его, Вы видите строку неправильных символов, или Вы видите единственное поле с шестнадцатеричными цифрами в нем? Кроме того, на что установлен ЛЕНГ (echo $LANG)? –  wingedsubmariner 07.09.2013, 19:44
  • 3
    я rememeber unicode были распечатаны как???? но теперь это работает. вероятно, некоторая опция не была включена. или я использовал unicode литеральную строку с L и wcout. Это странно. –   07.09.2013, 19:47
  • 4
    язык: спасибо en_US.UTF-8 –   07.09.2013, 19:51
  • 5
    , который я спросил, почему это происходит в stackoverflow.com/questions/18675720/cout-or-wcout-l –   08.09.2013, 19:52

В некоторых комментариях в качестве возможного решения предлагался ncurses. У этого есть свои плюсы и минусы:

  • ncurses полезен для рисования текста при перемещении по экрану (в полноэкранном или в полноэкранном режиме с использованием фильтра ).Пример OP печатает фрагмент одной строки, и обсуждение не дало никаких подсказок, было ли это типичным использованием или частью чего-то более сложного.
  • В ncurses есть набор символов для часто используемых строк. Конкретный показанный пример (смешанный символ одинарной и двойной ширины) отсутствует в этом списке, т. Е. символ Unicode 'BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE' (U + 2562)

enter image description here

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

normal line-drawing

double line-drawing

thick line-drawing

1
27.01.2020, 23:29

Теги

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