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


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.


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


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


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.