Jak przewijać duży plik danych, zachowując nagłówek

19

Załóżmy, że mam duży plik danych, który przepełnia ekran zarówno w kierunku pionowym, jak i poziomym. Jak mogę przeglądać ten plik, podczas gdy linie nagłówków pozostają na ekranie?

Na razie używam less -S, dzięki czemu mogę ładnie przewijać mój plik w poziomie i pionie. Jednak podczas przewijania w dół linie nagłówka oczywiście znikają. Czy istnieje sposób na ograniczenie ich zużycia?

Alternatywą jest używanie vimw trybie podzielonego ekranu z :set nowrap. Jednak teraz, gdy przewijam w poziomie, górne okno nie przewija się w ten sam sposób ( :windo set scrollbindo ile wiem, działa tylko w przypadku przewijania w pionie).

Bernhard
źródło
Co masz na myśli mówiąc, że nagłówek pozostaje widoczny, a dane ciągle się przewijają? Czy chcesz przez to powiedzieć, że pierwszy wiersz z nazwami kolumn pozostaje taki sam? Czy to tylko jeden plik z danymi i czy dane te ciągle się zmieniają, dlatego chcesz zobaczyć tylko zmienione wiersze? Czy chcesz zobaczyć tylko pierwsze N ​​wierszy czy ostatnie N wierszy?
polym
2
@polym: lesslub tail -fzachowują się dokładnie tak, jak normalnie, z tym wyjątkiem, że pierwsza linia wyświetlana na ekranie zawsze będzie linią nagłówka. Podobnie jak strony internetowe (lub Excel) ze stałym nagłówkiem, ale z przewijanym ciałem.
Mat
@polym ^ cokolwiek powiedział!
Debanjan Basu,
@polym, Pomyśl o tym, jak możesz zatrzymać widok poziomy i pionowy w arkuszu kalkulacyjnym. Zamrożone kolumny pozostają na miejscu podczas przewijania.
user208145

Odpowiedzi:

11

Jeśli znasz Vima, jest to prawdopodobnie najlepsza opcja dla Ciebie. Możesz włączyć tylko przewijanie w poziomie tylko przez zmianę 'scrollopt':

set scrollopt=hor

Dzięki temu vim -u NONEuzyskasz pożądane zachowanie dzięki:

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

Możesz dostosować 'sidescroll'i 'sidescrolloff'zmienić liczbę pomijanych kolumn oraz odległość, od której zaczyna się pomijanie krawędzi.

Thor
źródło
1
Czy można to zrobić za pomocą mniej? Zwłaszcza podczas przewijania ogromnych plików danych (zbyt dużych, aby załadować je do pamięci)?
NM
@NM: Zobacz inne odpowiedzi
Thor
Próbowałem tego i kiedy przewijam dolne okno, górne okno również przewija w dół
Daniel Serodio
@DanielSerodio: Wydaje się, że coś się zmieniło. Działa, jeśli ustawisz scrollopt na hor, zobacz zaktualizowaną odpowiedź
Thor
Zaktualizowana odpowiedź działa zgodnie z oczekiwaniami, dzięki za błyskawiczną odpowiedź :)
Daniel Serodio
17

W terminalach obsługujących ustawianie regionu przewijania:

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

(zakłada, że ​​powłoka zshlub bashustawia zmienne $COLUMNSi $LINESna podstawie wielkości terminala).

Stéphane Chazelas
źródło
1
Koleś! To pobożne! Przepraszam, nie mogłem się kontrolować. Czy możesz skierować mnie do stron internetowych, poleceń lub zmiennych w celu wdrożenia następujących funkcji?
Debanjan Basu,
1. wyjdź za pomocą q 2. przewiń w dół za pomocą klawiszy upidown
Debanjan Basu
czy można na lesssiebie nałożyć bez użycia headi tailza każdym razem przerysować ekran? Nadal <3 twoje rozwiązanie btw. Nie zaznaczam tego jeszcze poprawnie, ponieważ wydaje się, że edytujesz go i nie chcę, abyś sam się popadł w samozadowolenie; samozadowolenie jest zabójcą kreatywności, jak mi powiedziano! :)
Debanjan Basu
@DebanjanBasu możesz użyć less -Xzamiast tail -n ...powyższego, ale klawisz „w górę” usuwa tam nagłówek.
Stéphane Chazelas
Tak jak powiedziałem, jeśli masz jakieś lepsze pomysły, po prostu wskaż mi na to, lub lepiej jeszcze bardziej popraw swoją odpowiedź. Musiałem zaznaczyć to prawidłowe, ponieważ nie odpowiedział na pytanie, które początkowo hasła. Chodzi o to, aby lessśrodowisko umieszczone pomiędzy nagłówkiem a stopką było bardziej ogólne.
Debanjan Basu,
6

Spróbuj tego (musisz zainstalować multitail):

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

lub, w przypadku nagłówków dłuższych niż jedna linia:

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

Jeśli chcesz śledzić dane wyjściowe polecenia zamiast pliku:

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

lub użyj -todpowiednio. Pamiętaj, że może być konieczne użycie, unbufferaby wynik polecenia pojawił się natychmiast.

Możesz użyć, -Daby wyłączyć wyświetlanie linii statusu dla -whformularzy (to zniweczyłoby cel -tformularza).

Wstrzymano do odwołania.
źródło
2

Odpowiedź Thora nie wspominała o wyłączeniu pionowego „scrollopt”, co powoduje, że oba okna przewijają się w pionie. Więc dla mnie kompletnym rozwiązaniem jest wklejenie tego do vima:

:set scrollopt+=hor
:set scrollopt-=ver
:set nowrap
:1split
:windo set scrollbind
tomasz
źródło
Możesz ustawić scrolloptbezpośrednio za pomocą :scrollopt=horlub :scrollopt=hor,jump, w zależności od swoich preferencji. Oto VimDoc dla scrollopt.
Michael
1

To, o ile mi się udało 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

Jest to rozszerzenie odpowiedzi użytkownika 80519 na tmuxpodział okien. Zapisz jako hless.sh, uczyń go wykonywalnym i używaj go jak

hless.sh file
Saddy
źródło