如何在保留标题的同时滚动大数据文件


19

假设我有一些大的数据文件,这些文件在垂直和水平方向上都溢出了屏幕。当标题行停留在屏幕上时,如何浏览此文件?

目前,我正在使用less -S,以便可以很好地水平和垂直滚动文件。但是,向下滚动时,标题行明显消失。有没有办法减少使用?

一种替代方法是vim在的分屏模式下使用:set nowrap。但是,现在,如果我水平滚动,则顶部窗口将不会以相同的方式:windo set scrollbind滚动(据我所知,仅适用于垂直滚动)。


您是什么意思的标题保持可见,而数据不断滚动?您是说只希望列名的第一行保持不变吗?是否只有一个包含数据的文件,并且该数据会不断更改,因此您只想查看更改的行?您是否只想查看前N行或后N行?
polym 2014年

2
@polym:lesstail -f行为与通常一样,只是屏幕上显示的第一行始终是标题行。像具有固定标题但具有滚动正文的网站(或Excel)。
2014年

@polym ^不管他怎么说!
Debanjan Basu 2014年

@polym,考虑如何冻结电子表格中的水平和垂直视图。冻结的列在滚动时保持在原位。
user208145

Answers:


11

如果您熟悉vim,这可能是您的最佳选择。您可以通过更改启用仅水平滚动绑定'scrollopt'

set scrollopt=hor

因此,使用vim -u NONE,您将获得所需的行为:

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

您可能需要调整'sidescroll''sidescrolloff'更改分别跳过多少列和从边缘开始跳多远。


1
有没有办法做到这一点呢?尤其是在滚动巨大的数据文件时(太大而无法加载到内存中)?
新墨西哥州,

@NM:查看其他答案
雷神(Thor)

我尝试过此方法,当我向下滚动底部窗口时,顶部窗口也向下滚动
Daniel Serodio

@DanielSerodio:似乎有些变化。如果将scrollopt设置为hor,它会起作用,请参阅更新的答案
Thor

更新的答案按预期工作,感谢闪电般的快速回复:)
Daniel Serodio

17

在支持设置滚动区域的终端上:

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

(假设有一个像shell那样的外壳,zsh或根据终端的大小bash设置$COLUMNS$LINES变量的外壳)。


1
杜德!太好了!抱歉,无法控制自己。您能否将我定向到实现以下功能的网页或命令或变量?
Debanjan Basu

1.使用q 2. 退出,并使用updown键向下滚动
Debanjan Basu 2014年

是否可以less不使用head而背负自身,并且tail每次都可以重画屏幕?我仍然<3你的解决办法。我尚未将其标记为正确,因为您似乎正在对其进行编辑,并且我不希望您自满。有人告诉我,自满是一种创造力的杀手!:)
Debanjan Basu 2014年

您可以使用@DebanjanBasu less -X代替tail -n ...上面的内容,但是使用“ up”键可以删除其中的标题。
斯特凡Chazelas

就像我说的那样,如果您有更好的主意,请给我指出,或者更好的是,请进一步调整答案。我必须将其标记为正确,因为您已经回答了我最初提出的问题。想法是less在页眉和页脚之间放置一个环境,以使其成为更通用的工具。
Debanjan Basu 2014年

6

试试看(您需要安装multitail):

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

或,如果标题超过一行:

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

如果要遵循命令输出而不是文件:

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

-t适当使用。请注意,您可能需要使用,unbuffer以便您的命令输出立即出现。

您可以使用-D禁用-wh表单状态行的显示(这会违背-t表单的目的)。


2

Thor的回答没有提到禁用垂直的“ scrollopt”,这会使两个窗口都垂直滚动。所以对我来说,完整的解决方案是将其粘贴到vim中:

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

您可以根据自己的喜好scrollopt直接用:scrollopt=hor或进行设置:scrollopt=hor,jump这里的VimDocscrollopt
迈克尔

1

据我所知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

它的扩展user80519的回答tmux窗口拆分。另存为hless.sh,使其可执行并像使用它

hless.sh file
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.