Cara menggulir file data besar sambil menjaga tajuk

19

Misalkan saya memiliki beberapa file data besar, yang meluap layar dalam arah vertikal dan horizontal. Bagaimana saya bisa menelusuri file ini, sementara baris header tetap di layar?

Untuk saat ini, saya menggunakan less -S, sehingga saya dapat dengan baik menggulir file saya secara horizontal dan vertikal. Namun, ketika menggulir ke bawah, garis header jelas menghilang. Apakah ada cara untuk mengurangi penggunaan ini?

Alternatif menggunakan vimdalam mode layar terbagi dengan :set nowrap. Namun, sekarang jika saya menggulir secara horizontal, jendela atas tidak menggulir dengan cara yang sama ( :windo set scrollbindhanya berfungsi untuk pengguliran vertikal sejauh yang saya tahu).

Bernhard
sumber
Apa yang Anda maksud dengan tajuk tetap terlihat, sementara data terus bergulir? Apakah maksud Anda bahwa Anda hanya ingin baris pertama dengan nama kolom tetap sama? Apakah hanya satu file dengan data dan apakah data ini terus berubah dan karena itu Anda hanya ingin melihat baris yang diubah? Apakah Anda hanya ingin melihat baris N pertama atau baris N terakhir?
polym
2
@ polym: lessatau tail -fyang berperilaku persis seperti biasanya, kecuali bahwa baris pertama yang ditampilkan di layar akan selalu menjadi baris header. Seperti situs web (atau Excel) dengan tajuk yang tetap tetapi badan pengguliran.
Mat
@polym ^ apa pun yang dia katakan!
Debanjan Basu
@polym, Pikirkan bagaimana Anda dapat membekukan tampilan horizontal dan vertikal dalam spreadsheet. Kolom beku tetap di tempatnya saat menggulir.
user208145

Jawaban:

11

Jika Anda terbiasa dengan vim, ini mungkin opsi terbaik untuk Anda. Anda dapat mengaktifkan horizontal-scroll-bind-only dengan mengubah 'scrollopt':

set scrollopt=hor

Jadi dengan vim -u NONE, Anda mendapatkan perilaku yang diinginkan dengan:

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

Anda mungkin ingin menyesuaikan 'sidescroll'dan 'sidescrolloff'mengubah berapa banyak kolom yang dilewati dan seberapa jauh dari tepi yang dilewati dimulai.

Thor
sumber
1
Apakah ada cara untuk melakukan ini dengan lebih sedikit? Terutama saat menggulir file data besar (terlalu besar untuk dimuat ke dalam memori)?
NM
@ NM: Lihat jawaban lain
Thor
Saya mencoba ini dan ketika saya menggulir ke bawah jendela bawah, jendela atas juga menggulir ke bawah
Daniel Serodio
@DanielSerodio: Sesuatu sepertinya telah berubah. Ini berfungsi jika Anda menyetel scrollopt ke hor, lihat jawaban yang diperbarui
Thor
Jawaban yang diperbarui berfungsi seperti yang diharapkan, terima kasih atas jawaban cepat kilat :)
Daniel Serodio
17

Pada terminal yang mendukung pengaturan wilayah gulir:

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

(mengasumsikan shell seperti zshatau bashyang menetapkan $COLUMNSdan $LINESvariabel berdasarkan ukuran terminal).

Stéphane Chazelas
sumber
1
Kawan! Itu saleh! Maaf, tidak bisa mengendalikan diri. Bisakah Anda mengarahkan saya ke halaman web atau perintah atau variabel untuk mengimplementasikan fungsi-fungsi berikut?
Debanjan Basu
1. keluar dengan q 2. gulir ke bawah dengan updan downtombol
Debanjan Basu
apakah mungkin untuk membonceng pada lessdirinya sendiri tanpa menggunakan headdan tailuntuk menggambar ulang layar setiap kali? Aku masih <3 solusimu btw. Saya belum menandainya dengan benar karena Anda tampaknya menyuntingnya dan saya tidak ingin Anda puas; kepuasan diri adalah pembunuh kreativitas, saya diberitahu! :)
Debanjan Basu
@ DebanjanBasu dapat Anda gunakan less -Xdi tempat di tail -n ...atas tetapi tombol "atas" menghapus header di sana.
Stéphane Chazelas
Seperti yang saya katakan, jika Anda memiliki ide yang lebih baik tunjukkan saja kepada saya, atau lebih baik tolong atur jawaban Anda lebih jauh. Saya harus menandainya dengan benar karena Anda telah menjawab pertanyaan yang awalnya saya tanyakan. Idenya adalah memiliki lesslingkungan yang diapit antara header dan footer, untuk menjadikannya alat yang lebih umum.
Debanjan Basu
6

Coba ini (Anda harus menginstal multitail):

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

atau, untuk tajuk yang lebih panjang dari satu baris:

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

Jika Anda ingin mengikuti output perintah alih-alih file:

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

atau gunakan yang -tsesuai. Perhatikan bahwa Anda mungkin perlu menggunakan unbufferagar output perintah Anda segera muncul.

Anda dapat menggunakan -Duntuk menonaktifkan tampilan baris status untuk -whformulir (itu akan mengalahkan tujuan -tformulir).

Dijeda sampai pemberitahuan lebih lanjut.
sumber
2

Jawaban Thor tidak menyebutkan penonaktifan "scrollopt" vertikal, yang membuat kedua jendela bergulir secara vertikal. Jadi bagi saya solusi lengkapnya adalah menempelkan ini ke vim:

:set scrollopt+=hor
:set scrollopt-=ver
:set nowrap
:1split
:windo set scrollbind
tomasz
sumber
Anda dapat mengatur scrolloptsecara langsung dengan :scrollopt=horatau :scrollopt=hor,jump, tergantung pada preferensi Anda. Inilah VimDoc untuk scrollopt.
Michael
1

Sejauh ini yang saya dapat 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

Ini adalah ekstensi dari jawaban pengguna80519 untuk tmuxpemisahan jendela. Simpan sebagai hless.sh, buat itu dapat dieksekusi dan gunakan seperti

hless.sh file
Saddy
sumber