Come scorrere file di dati di grandi dimensioni mantenendo l'intestazione


19

Supponiamo di avere un file di dati di grandi dimensioni, che trabocca lo schermo sia in direzione verticale che orizzontale. Come posso sfogliare questo file, mentre le righe di intestazione rimangono sullo schermo?

Per il momento, lo sto usando less -S, in modo da poter scorrere il mio file in orizzontale e in verticale. Tuttavia, quando si scorre verso il basso, le righe di intestazione ovviamente scompaiono. C'è un modo per mantenerli usando meno?

Un'alternativa sta usando vimin modalità schermo diviso con :set nowrap. Tuttavia, ora se scorro in orizzontale, la finestra superiore non scorre allo stesso modo ( :windo set scrollbindfunziona solo per lo scorrimento verticale per quanto ne so).


Cosa intendi con intestazione rimane visibile, mentre i dati continuano a scorrere? Vuoi dire che vuoi solo che la prima riga con i nomi delle colonne mantenga lo stesso? È solo un file con dati e questi dati continuano a cambiare e quindi vuoi vedere solo le righe modificate? Vuoi vedere solo le prime N righe o le ultime N righe?
polimero

2
@polym: lesso tail -fche si comportano esattamente come fanno normalmente, tranne per il fatto che la prima riga mostrata sullo schermo sarebbe sempre la riga di intestazione. Come i siti Web (o Excel) con un'intestazione fissa ma corpo scorrevole.
Mat

@polym ^ qualunque cosa abbia detto!
Debanjan Basu,

@polym, pensa a come bloccare una vista orizzontale e verticale in un foglio di calcolo. Le colonne congelate rimangono in posizione durante lo scorrimento.
user208145

Risposte:


11

Se hai familiarità con vim, questa è probabilmente l'opzione migliore per te. Puoi abilitare orizzontale-scroll-bind-only cambiando 'scrollopt':

set scrollopt=hor

Quindi vim -u NONE, ottieni il comportamento desiderato con:

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

È possibile che si desideri regolare 'sidescroll'e 'sidescrolloff'modificare il numero di colonne ignorate e la distanza che inizia rispettivamente con il salto dal bordo.


1
C'è un modo per farlo con meno? Soprattutto durante lo scorrimento di enormi file di dati (troppo grandi per essere caricati in memoria)?
NM,

@NM: vedi le altre risposte
Thor

Ho provato questo e quando scorro la finestra in basso, anche la finestra in alto scorre in basso
Daniel Serodio,

@DanielSerodio: Qualcosa sembra essere cambiato. Funziona se si imposta scrollopt su hor, vedere la risposta aggiornata
Thor

La risposta aggiornata funziona come previsto, grazie per la risposta fulminea :)
Daniel Serodio,

17

Sui terminali che supportano l'impostazione della regione di scorrimento:

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

(presuppone una shell simile zsho bashche imposta le variabili $COLUMNSe in $LINESbase alla dimensione del terminale).


1
Tipo! Questo è divino! Spiacente, non sono riuscito a controllarmi. Potresti indirizzarmi verso pagine Web o comandi o variabili per implementare le seguenti funzioni?
Debanjan Basu,

1. esci con q 2. scorri verso il basso con upe i downtasti
Debanjan Basu il

è possibile fare il piggyback su lessse stesso senza usare heade tailridisegnare lo schermo ogni volta? Ho ancora <3 la tua soluzione tra l'altro. Non lo sto ancora contrassegnando come corretto perché sembra che tu lo stia modificando e non voglio che tu diventi compiacente; compiacimento è un killer della creatività, mi è stato detto! :)
Debanjan Basu,

@DebanjanBasu è possibile utilizzare less -Xal posto di tail -n ...sopra ma il tasto "su" elimina l'intestazione lì.
Stéphane Chazelas,

Come ho detto, se hai qualche idea migliore, indicamelo, o meglio, per favore, modifica ulteriormente la tua risposta. Ho dovuto segnarlo corretto perché si hanno risposto alla domanda che ho inizialmente chiesto. L'idea è di avere un lessambiente inserito tra un'intestazione e un piè di pagina, per renderlo uno strumento più generale.
Debanjan Basu,

6

Prova questo (dovrai installare multitail):

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

oppure, per intestazioni più lunghe di una riga:

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

Se si desidera seguire l'output del comando anziché un file:

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

o utilizzare -tcome appropriato. Si noti che potrebbe essere necessario utilizzare in unbuffermodo che l'output del comando venga visualizzato immediatamente.

È possibile utilizzare -Dper disabilitare la visualizzazione delle righe di stato per i -whmoduli (ciò vanificherebbe lo scopo del -tmodulo).


2

La risposta di Thor non menzionava la disabilitazione dello "scrollopt" verticale, che fa scorrere entrambe le finestre verticalmente. Quindi per me la soluzione completa sta incollando questo in vim:

:set scrollopt+=hor
:set scrollopt-=ver
:set nowrap
:1split
:windo set scrollbind

Puoi impostare scrolloptdirettamente con :scrollopt=horo :scrollopt=hor,jump, a seconda delle tue preferenze. Ecco il VimDoc per scrollopt.
Michael

1

Questo è quanto ho ottenuto con 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

È un'estensione della risposta di user80519 per la tmuxdivisione delle finestre. Salva come hless.sh, rendilo eseguibile e usalo come

hless.sh file
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.