Cómo desplazar archivos de datos grandes mientras se mantiene el encabezado

19

Supongamos que tengo un gran archivo de datos, que desborda la pantalla en dirección vertical y horizontal. ¿Cómo puedo examinar este archivo, mientras las líneas de encabezado permanecen en la pantalla?

Por el momento, estoy usando less -S, para poder desplazar mi archivo horizontal y verticalmente. Sin embargo, al desplazarse hacia abajo, las líneas del encabezado obviamente desaparecen. ¿Hay alguna manera de mantener esto usando menos?

Una alternativa es usar el vimmodo de pantalla dividida con :set nowrap. Sin embargo, ahora si me desplazo horizontalmente, la ventana superior no se desplaza de la misma manera ( :windo set scrollbindsolo funciona para el desplazamiento vertical hasta donde yo sé).

Bernhard
fuente
¿Qué quiere decir con encabezado permanece visible, mientras los datos siguen desplazándose? ¿Quiere decir que solo desea que la primera línea con los nombres de columna se mantenga igual? ¿Es solo un archivo con datos y estos datos siguen cambiando y, por lo tanto, solo desea ver las filas modificadas? ¿Solo desea ver las primeras N filas o las últimas N filas?
Polym
2
@polym: lesso tail -fque se comportan exactamente como lo hacen normalmente, excepto que la primera línea que se muestra en la pantalla siempre será la línea de encabezado. Al igual que los sitios web (o Excel) con un encabezado fijo pero cuerpo de desplazamiento.
Mat
@polym ^ lo que sea que dijo!
Debanjan Basu
@polym, piensa en cómo puedes congelar una vista horizontal y vertical en una hoja de cálculo. Las columnas congeladas permanecen en su lugar mientras se desplazan.
user208145

Respuestas:

11

Si está familiarizado con vim, esta es probablemente la mejor opción para usted. Puede habilitar horizontal-scroll-bind-only cambiando 'scrollopt':

set scrollopt=hor

Entonces vim -u NONE, con , obtienes el comportamiento deseado con:

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

Es posible que desee ajustar 'sidescroll'y 'sidescrolloff'cambiar cuántas columnas se omiten y qué tan lejos comienza el salto de borde, respectivamente.

Thor
fuente
1
¿Hay alguna manera de hacer esto con menos? ¿Especialmente cuando se desplaza a través de enormes archivos de datos (demasiado grandes para cargarlos en la memoria)?
NM
@NM: Vea las otras respuestas
Thor,
Intenté esto y cuando me desplazo hacia abajo por la ventana inferior, la ventana superior también se desplaza hacia abajo
Daniel Serodio
@DanielSerodio: Algo parece haber cambiado. Funciona si configuras scrollopt en hor, mira la respuesta actualizada
Thor
La respuesta actualizada funciona como se esperaba, gracias por la rápida respuesta :)
Daniel Serodio
17

En terminales que admiten la configuración de la región de desplazamiento:

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

(supone un shell como zsho bashque establece las variables $COLUMNSy en $LINESfunción del tamaño del terminal).

Stéphane Chazelas
fuente
1
¡Tipo! Eso es piadoso! Lo siento, no pude controlarme. ¿Podría dirigirme a páginas web o comandos o variables para implementar las siguientes funciones?
Debanjan Basu
1. salga con q 2. desplácese hacia abajo con upy downteclas
Debanjan Basu
¿Es posible llevarlo encima lesssin usar heady tailvolver a dibujar la pantalla cada vez? Todavía <3 su solución por cierto. Todavía no lo estoy marcando correctamente porque parece que lo estás editando y no quiero que seas complaciente; La complacencia es un asesino de la creatividad, ¡me dicen! :)
Debanjan Basu
@DebanjanBasu puede usarlo less -Xen lugar de tail -n ...arriba, pero la tecla "arriba" elimina el encabezado allí.
Stéphane Chazelas
Como dije, si tiene alguna idea mejor, solo apúnteme a eso, o mejor aún, modifique aún más su respuesta. Tenía que marcarlo correcta porque se ha respondido a la pregunta que en un principio le pregunté. La idea es tener un lessentorno entre un encabezado y un pie de página, para que sea una herramienta más general.
Debanjan Basu
6

Pruebe esto (necesitará instalar multitail):

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

o, para encabezados de más de una línea:

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

Si desea seguir la salida del comando en lugar de un archivo:

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

o usar -tsegún corresponda. Tenga en cuenta que es posible que necesite usar unbufferpara que la salida de su comando aparezca de inmediato.

Puede usar -Dpara deshabilitar la visualización de líneas de estado para los -whformularios (sería contrario al propósito del -tformulario).

Pausado hasta nuevo aviso.
fuente
2

La respuesta de Thor no mencionó la desactivación del "scrollopt" vertical, que hace que ambas ventanas se deslicen verticalmente. Entonces, para mí, la solución completa es pegar esto en vim:

:set scrollopt+=hor
:set scrollopt-=ver
:set nowrap
:1split
:windo set scrollbind
tomasz
fuente
Puede configurar scrolloptdirectamente con :scrollopt=horo :scrollopt=hor,jump, según sus preferencias. Aquí está el VimDoc para scrollopt.
Michael
1

Esto es hasta donde llegué 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

Es una extensión de la respuesta del usuario80519 para la tmuxdivisión de ventanas. Guardar como hless.sh, hacerlo ejecutable y usarlo como

hless.sh file
Saddy
fuente