Як прокручувати великий файл даних, зберігаючи заголовок


19

Припустимо, у мене є великий файл даних, який переповнює екран у вертикальному та горизонтальному напрямку. Як я можу переглядати цей файл, поки рядки заголовків залишаються на екрані?

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

Альтернативою є використання vimв режимі розділеного екрана з :set nowrap. Однак, якщо я прокручую горизонтально, верхнє вікно не прокручується так само ( :windo set scrollbindпрацює лише для вертикальної прокрутки, наскільки я знаю).


Що ви маєте на увазі під заголовком залишається видимим, а дані постійно прокручуються? Ви маєте на увазі, що ви хочете, щоб перший рядок із назвами стовпців зберігався однаково? Це лише один файл з даними і чи ці дані постійно змінюються, і тому ви хочете бачити лише змінені рядки? Ви хочете бачити лише перші N рядків або останні N рядків?
полім

2
@polym: lessабо tail -fповодяться так, як вони зазвичай, за винятком того, що перший рядок, який відображається на екрані, завжди буде рядком заголовка. Як веб-сайти (або Excel) із фіксованим заголовком, але тілом прокрутки.
Мат

@polym ^ що б він не сказав!
Дебанджан Басу

@polym, Подумайте, як ви можете заморозити горизонтальний і вертикальний вигляд у таблиці. Стовпчики заморожені залишаються на місці під час прокрутки.
користувач208145

Відповіді:


11

Якщо ви знайомі з vim, це, мабуть, найкращий варіант для вас. Ви можете ввімкнути лише горизонтальне прокручування, прив'язавши лише 'scrollopt':

set scrollopt=hor

Отже vim -u NONE, ви отримуєте бажану поведінку за допомогою:

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

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


1
Чи є спосіб зробити це з меншим? Особливо, коли прокручуєш величезні файли даних (занадто великі для завантаження в пам'ять)?
НМ

@NM: Дивіться інші відповіді
Тор

Я спробував це, і коли я прокручую нижнє вікно, верхнє вікно також прокручується вниз
Даніель Серодіо

@DanielSerodio: Щось, здається, змінилося. Це спрацьовує, якщо ви встановите прокрутку hor, дивіться оновлену відповідь
Тор

Оновлена ​​відповідь працює як очікувалося, дякую за блискавичну відповідь :)
Даніель Серодіо

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 ваше рішення BTW. Я ще не позначаю це правильним, тому що ти, здається, редагуєш його, і я не хочу, щоб ти був самовдоволений; поступливість - це вбивця творчості, мені кажуть! :)
Debanjan Basu

@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

Ви можете встановити 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

Це розширення відповіді user80519 для tmuxрозбиття вікон. Збережіть як hless.sh, зробіть його виконуваним і використовуйте так

hless.sh file
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.