Cách cuộn tệp dữ liệu lớn trong khi giữ tiêu đề


19

Giả sử tôi có một số tệp dữ liệu lớn, tràn màn hình theo cả chiều dọc và chiều ngang. Làm cách nào tôi có thể duyệt tệp này trong khi các dòng tiêu đề vẫn ở trên màn hình?

Hiện tại, tôi đang sử dụng less -S, để tôi có thể cuộn tệp của mình theo chiều ngang và chiều dọc. Tuy nhiên, khi cuộn xuống, các dòng tiêu đề rõ ràng biến mất. Có cách nào để giữ những thứ này sử dụng ít hơn không?

Một thay thế là sử dụng vimtrong chế độ chia đôi màn hình với :set nowrap. Tuy nhiên, bây giờ nếu tôi cuộn theo chiều ngang, cửa sổ trên cùng sẽ không cuộn theo cùng một cách ( :windo set scrollbindchỉ hoạt động đối với cuộn dọc theo như tôi biết).


Bạn có ý nghĩa gì bởi tiêu đề vẫn hiển thị, trong khi dữ liệu tiếp tục cuộn? Bạn có nghĩa là bạn chỉ muốn dòng đầu tiên với tên cột giữ nguyên? Có phải chỉ có một tệp có dữ liệu và dữ liệu này có thay đổi không và do đó bạn chỉ muốn xem các hàng đã thay đổi? Bạn chỉ muốn xem N hàng đầu tiên hoặc N hàng cuối?
polym

2
@polym: lesshoặc tail -fhoạt động chính xác như họ làm bình thường, ngoại trừ dòng đầu tiên hiển thị trên màn hình sẽ luôn là dòng tiêu đề. Giống như các trang web (hoặc Excel) với tiêu đề cố định nhưng cơ thể cuộn.
Mat

@polym ^ bất cứ điều gì anh ấy nói!
Debanjan Basu

@polym, Hãy nghĩ về cách bạn có thể đóng băng chế độ xem ngang và dọc trong bảng tính. Cột đóng băng ở lại tại chỗ trong khi cuộn.
dùng208145

Câu trả lời:


11

Nếu bạn quen thuộc với vim, đây có lẽ là lựa chọn tốt nhất cho bạn. Bạn có thể bật chỉ cuộn ngang cuộn chỉ bằng cách thay đổi 'scrollopt':

set scrollopt=hor

Vì vậy, với vim -u NONE, bạn có được hành vi mong muốn với:

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

Bạn có thể muốn điều chỉnh 'sidescroll''sidescrolloff'thay đổi số lượng cột được bỏ qua và khoảng cách bắt đầu bỏ qua cạnh tương ứng.


1
Có cách nào để làm điều này với ít hơn? Đặc biệt là khi cuộn qua các tệp dữ liệu khổng lồ (quá lớn để tải vào bộ nhớ)?
NM

@NM: Xem các câu trả lời khác
Thor

Tôi đã thử điều này và khi tôi cuộn xuống cửa sổ dưới cùng, cửa sổ trên cùng cũng cuộn xuống
Daniel Serodio

@DanielSerodio: Một cái gì đó dường như đã thay đổi. Nó hoạt động nếu bạn đặt scrollopt thành hor, xem câu trả lời được cập nhật
Thor

Câu trả lời được cập nhật hoạt động như mong đợi, cảm ơn vì đã trả lời nhanh như chớp :)
Daniel Serodio

17

Trên các thiết bị đầu cuối hỗ trợ thiết lập vùng cuộn:

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

(giả sử một shell giống zshhoặc bashđặt các biến $COLUMNS$LINESdựa trên kích thước của thiết bị đầu cuối).


1
Anh bạn! Đó là tin kính! Xin lỗi, không thể kiểm soát bản thân. Bạn có thể hướng tôi đến các trang web hoặc các lệnh hoặc biến để thực hiện các chức năng sau không?
Debanjan Basu

1. thoát với q 2. cuộn xuống bằng updownphím
Debanjan Basu

Có thể tự cõng lessmà không cần sử dụng headtailvẽ lại màn hình mỗi lần không? Tôi vẫn <3 giải pháp của bạn btw. Tôi chưa đánh dấu đúng vì bạn dường như đang chỉnh sửa nó và tôi không muốn bạn tự mãn; tự mãn là một kẻ giết người sáng tạo, tôi được bảo! :)
Debanjan Basu

@DebanjanBasu bạn có thể sử dụng less -Xthay cho tail -n ...ở trên nhưng phím "lên" sẽ xóa tiêu đề ở đó.
Stéphane Chazelas

Giống như tôi đã nói, nếu bạn có bất kỳ ý tưởng nào tốt hơn, hãy chỉ cho tôi điều đó, hoặc tốt hơn nữa, xin vui lòng điều chỉnh câu trả lời của bạn hơn nữa. Tôi phải đánh dấu nó đúng bởi vì bạn đã trả lời câu hỏi mà tôi đã hỏi ban đầu. Ý tưởng là có một lessmôi trường kẹp giữa một tiêu đề và chân trang, để làm cho nó trở thành một công cụ tổng quát hơn.
Debanjan Basu

6

Hãy thử điều này (bạn sẽ cần cài đặt multitail):

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

hoặc, đối với các tiêu đề dài hơn một dòng:

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

Nếu bạn muốn theo dõi đầu ra lệnh thay vì một tệp:

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

hoặc sử dụng -tkhi thích hợp. Lưu ý rằng bạn có thể cần phải sử dụng unbufferđể đầu ra lệnh của bạn xuất hiện ngay lập tức.

Bạn có thể sử dụng -Dđể vô hiệu hóa hiển thị các dòng trạng thái cho các -whbiểu mẫu (nó sẽ đánh bại mục đích của -tbiểu mẫu).


2

Câu trả lời của Thor đã không đề cập đến việc vô hiệu hóa "scrollopt" dọc, khiến cả hai cửa sổ cuộn theo chiều dọc. Vì vậy, đối với tôi, giải pháp hoàn chỉnh là dán cái này vào vim:

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

Bạn có thể đặt scrollopttrực tiếp với :scrollopt=horhoặc :scrollopt=hor,jump, tùy thuộc vào sở thích của bạn. Đây là VimDoc cho scrollopt.
Michael

1

Điều này là như tôi đã nhận được với 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

Đây là phần mở rộng của câu trả lời của người dùng dành cho tmuxviệc chia tách cửa sổ. Lưu dưới dạng hless.sh, làm cho nó thực thi và sử dụng nó như

hless.sh file
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.