Como rolar um grande arquivo de dados enquanto mantém o cabeçalho

19

Suponha que eu tenha algum grande arquivo de dados, que transborda a tela na direção vertical e horizontal. Como posso navegar neste arquivo, enquanto as linhas de cabeçalho permanecem na tela?

No momento, estou usando less -S, para que eu possa rolar bem meu arquivo na horizontal e na vertical. No entanto, ao rolar para baixo, as linhas do cabeçalho obviamente desaparecem. Existe uma maneira de mantê-los usando menos?

Uma alternativa é usar vimno modo de tela dividida com :set nowrap. No entanto, agora, se eu rolar horizontalmente, a janela superior não rola da mesma maneira ( :windo set scrollbindfunciona apenas para rolagem vertical até onde eu sei).

Bernhard
fonte
O que você quer dizer com cabeçalho permanece visível, enquanto os dados continuam rolando? Você quer dizer que apenas deseja que a primeira linha com os nomes das colunas seja a mesma? É apenas um arquivo com dados e esses dados continuam mudando e, portanto, você deseja apenas ver as linhas alteradas? Deseja ver apenas as primeiras N linhas ou as últimas N linhas?
Polym
2
@ polym: lessou tail -fque se comportam exatamente como normalmente, exceto que a primeira linha mostrada na tela seria sempre a linha do cabeçalho. Como sites (ou Excel) com um cabeçalho fixo, mas com corpo de rolagem.
Mat
@polym ^ o que ele disse!
perfil completo de Debanjan Basu
@polym, pense em como você pode congelar uma visualização horizontal e vertical em uma planilha. As colunas congeladas permanecem no lugar enquanto rolam.
user208145

Respostas:

11

Se você está familiarizado com o vim, esta é provavelmente a melhor opção para você. Você pode ativar o horizontal-scroll-bind-only alterando 'scrollopt':

set scrollopt=hor

Assim vim -u NONE, você obtém o comportamento desejado com:

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

Convém ajustar 'sidescroll'e 'sidescrolloff'alterar quantas colunas são ignoradas e a que distância da borda inicia respectivamente.

Thor
fonte
1
Existe uma maneira de fazer isso com menos? Especialmente ao percorrer enormes arquivos de dados (muito grandes para serem carregados na memória)?
NM
@NM: Veja as outras respostas
Thor
Eu tentei isso e quando eu rolar para baixo a janela inferior, a janela rola de cima para baixo demais
Daniel Serodio
@DanielSerodio: Algo parece ter mudado. Ele funciona se você definir scrollopt para hor, ver a resposta atualizados
Thor
A resposta atualizada funciona como esperado, graças para o relâmpago resposta rápida :)
Daniel Serodio
17

Nos terminais compatíveis com a configuração da região de rolagem:

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"
)

(assume um shell como zshou bashque define as variáveis $COLUMNSe com $LINESbase no tamanho do terminal).

Stéphane Chazelas
fonte
1
Cara! Isso é divino! Desculpe, não consegui me controlar. Você poderia me direcionar para páginas da Web, comandos ou variáveis ​​para implementar as seguintes funções?
perfil completo de Debanjan Basu
1. saída com q 2. Vá para baixo com upe downchaves
Debanjan Basu
é possível pegar carona em lesssi mesmo sem usar heade tailredesenhar a tela a cada vez? Eu ainda <3 sua solução btw. Ainda não estou marcando como correto, porque você parece estar editando e não quero que você seja complacente; complacência é um assassino de criatividade, me disseram! :)
Debanjan Basu
@DebanjanBasu você pode usar less -Xno lugar tail -n ...acima, mas a tecla "para cima" exclui o cabeçalho lá.
Stéphane Chazelas
Como eu disse, se você tiver alguma idéia melhor, aponte-me para isso ou, melhor ainda, ajuste sua resposta ainda mais. Eu tive que marcá-lo correto, porque você respondeu à pergunta que eu inicialmente perguntou. A idéia é ter um lessambiente imprensado entre um cabeçalho e um rodapé, para torná-lo uma ferramenta mais geral.
perfil completo de Debanjan Basu
6

Tente isso (você precisará instalar multitail):

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

ou, para cabeçalhos com mais de uma linha:

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

Se você deseja seguir a saída do comando em vez de um arquivo:

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

ou use -tconforme apropriado. Observe que você pode precisar usá- unbufferlo para que sua saída de comando apareça imediatamente.

Você pode usar -Dpara desativar a exibição de linhas de status para os -whformulários (isso anularia a finalidade do -tformulário).

Pausado até novo aviso.
fonte
2

A resposta de Thor não mencionou a desativação do "scrollopt" vertical, que faz as duas janelas rolarem verticalmente. Então, para mim, a solução completa é colar isso no vim:

:set scrollopt+=hor
:set scrollopt-=ver
:set nowrap
:1split
:windo set scrollbind
tomasz
fonte
Você pode definir scrolloptdiretamente com :scrollopt=horou :scrollopt=hor,jump, dependendo de suas preferências. Aqui está o VimDoc para scrollopt.
Michael
1

Isto é tanto quanto eu cheguei com 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

É uma extensão da resposta do usuário80519 para a tmuxdivisão de janelas. Salve como hless.sh, torne-o executável e use-o como

hless.sh file
Saddy
fonte