Как прокрутить большой файл данных с сохранением заголовка

19

Предположим, у меня есть большой файл данных, который переполняет экран как в вертикальном, так и в горизонтальном направлении. Как я могу просмотреть этот файл, пока строки заголовка остаются на экране?

На данный момент я использую less -S, чтобы я мог красиво прокрутить мой файл по горизонтали и вертикали. Однако при прокрутке вниз строки заголовка, очевидно, исчезают. Есть ли способ сохранить их, используя меньше?

Альтернативой является использование vimв режиме разделенного экрана с :set nowrap. Однако теперь, если я прокручиваю горизонтально, верхнее окно не прокручивается таким же образом ( :windo set scrollbindнасколько мне известно, работает только с вертикальной прокруткой).

Бернхард
источник
Что вы подразумеваете под заголовком, остается видимым, в то время как данные продолжают прокручиваться? Вы хотите сказать, что вы хотите, чтобы первая строка с именами столбцов оставалась неизменной? Это только один файл с данными, и эти данные постоянно меняются, и поэтому вы хотите видеть только измененные строки? Вы хотите видеть только первые N строк или последние N строк?
Полим
2
@polym: lessили они tail -fведут себя точно так же, как обычно, за исключением того, что первая строка, отображаемая на экране, всегда будет строкой заголовка. Как веб-сайты (или Excel) с фиксированным заголовком, но с прокруткой тела.
Мат
@polym ^ что бы он ни говорил!
Дебанжан Басу
@polym, подумай, как можно заморозить горизонтальный и вертикальный вид в электронной таблице. Замороженные столбцы остаются на месте при прокрутке.
user208145

Ответы:

11

Если вы знакомы с vim, это, вероятно, лучший вариант для вас. Вы можете включить горизонтальную прокрутку-привязку только путем изменения 'scrollopt':

set scrollopt=hor

Таким образом vim -u NONE, вы получаете желаемое поведение с:

:set scrollopt=hor
:set nowrap
:1split
:windo set scrollbind

Возможно, вы захотите настроить 'sidescroll'и 'sidescrolloff'изменить количество пропущенных столбцов и, соответственно, как далеко от пропуска края начинается.

Тор
источник
1
Есть ли способ сделать это с меньшими затратами? Особенно при прокрутке огромных файлов данных (слишком большой для загрузки в память)?
NM
@NM: Смотрите другие ответы
Thor
Я попробовал это, и когда я прокручиваю вниз нижнее окно, верхнее окно тоже прокручивается вниз
Даниэль Серодио
@DanielSerodio: Кажется, что-то изменилось. Это работает, если вы установите scrollopt для hor, см обновленный ответ
Thor
Обновленный ответ работает, как и ожидалось, спасибо за молниеносный ответ :)
Даниэль Серодио
17

На терминалах, которые поддерживают настройку области прокрутки:

tailf() ( # args: <file> [<number-of-header-lines>]
  trap 'tput csr 0 "$((LINES-1))"' INT
  tput csr "$((1+${2-1}))" "$((LINES-1))"
  tput clear
  {
    head -n"${2-1}"
    printf "%${COLUMNS}s\n" "" | tr ' ' =
    tail -n "$((LINES-1-${2-1}))" -f
  } < "$1"
)

(предполагается , что оболочка , как , zshили , bashчто устанавливает $COLUMNSи $LINESпеременные на основании размера терминала).

Стефан Шазелас
источник
1
Чувак! Это божественно! Извините, не мог себя контролировать. Не могли бы вы направить меня на веб-страницы или команды или переменные для реализации следующих функций?
Дебанжан Басу
1. Выход с q 2. прокрутки вниз с upи downключами
Debanjan Бас
можно ли прокручивать lessсебя без использования headи tailперерисовывать экран каждый раз? Я до сих пор <3 ваше решение, кстати. Я пока не отмечаю это правильно, потому что вы, кажется, редактируете это, и я не хочу, чтобы вы были довольны; мне говорят, что самоуспокоенность - убийца творчества! :)
Дебанжан Басу
@DebanjanBasu вы можете использовать less -Xвместо tail -n ...вышеупомянутого, но клавиша «вверх» удаляет заголовок там.
Стефан Шазелас
Как я уже сказал, если у вас есть идеи получше, просто укажите мне на это, или еще лучше, пожалуйста, подправьте свой ответ дальше. Я должен был отметить это правильно , потому что вы уже ответили на вопрос , который я изначально просил. Идея состоит в том, чтобы lessокружение было зажато между верхним и нижним колонтитулом, чтобы сделать его более общим инструментом.
Дебанжан Басу
6

Попробуйте это (вам нужно установить multitail):

multitail -du -t "$(head -n 1 filename)" filename

или для заголовков длиннее одной строки:

multitail -wh 2 -l "head -n 2 filename" filename

Если вы хотите следовать выводу команды вместо файла:

multitail -wh 2 -l "command | head -n 2" -l command

или используйте -tпо необходимости. Обратите внимание, что вам может понадобиться использовать, unbufferчтобы вывод вашей команды появился немедленно.

Вы можете использовать, -Dчтобы отключить отображение строк состояния для -whформ (это будет противоречить цели -tформы).

Приостановлено до дальнейшего уведомления.
источник
2

В ответе Тора не упоминалось отключение вертикальной прокрутки, из-за которой оба окна прокручиваются вертикально. Так что для меня полное решение - вставить это в vim:

:set scrollopt+=hor
:set scrollopt-=ver
:set nowrap
:1split
:windo set scrollbind
Tomasz
источник
Вы можете установить scrolloptнапрямую с помощью :scrollopt=horили :scrollopt=hor,jump, в зависимости от ваших предпочтений. Вот VimDoc для scrollopt.
Майкл
1

Это насколько я получил с tmux:

#!/bin/bash

tmux new-session -s main -n 'w1' -d
tmux send-keys -t main:w1.0 "tail -f <(head -n1 $1)" C-j
tmux split-window -v
tmux resize-pane -t 0 -y 2
tmux send-keys -t 1 "tail -n+2 $1|less -S" C-j
tmux attach -t main

Это расширение ответа пользователя 80519 за tmuxразбиение окна. Сохранить как hless.sh, сделать его исполняемым и использовать его как

hless.sh file
Saddy
источник