*nix 中制表符分隔文件的终端窗口查看器?

Mic*_* H. 5 unix terminal tabs

我使用了许多制表符分隔的数据文件,其中列的长度不确定。

通常,人们查看这些文件的方式是将它们从服务器下载到 Windows 或 Mac 计算机,然后在 Excel 中打开它们。这当然是功能齐全的,允许过滤和其他不错的选项。但有时,您只想在命令行上快速查看某些内容。

我编写了一个简单的实用程序来显示<n>文件的第一行,如下所示:

--- 第 1 行 ---
1:{header-1} 2:{header-2} 3:...

--- 第 2 行 ---
1:{data-1} 2:{data-2} 3:...

显然,这是非常蹩脚的,但足以通过 grep 进行管道传输,或者找出要对哪些标题列使用“cut -f”。

是否有基于 *nix 的终端会话查看器,它将显示制表符分隔文件的行和列,并让您​​将查看窗口移动到文件上,或者以其他方式查看数据?

我不想自己写这个;相反,我只是制作了一个重新格式化程序,它将用空格替换制表符以进行填充,这样我就可以在 emacs 中打开文件并查看对齐的列。但是如果已经有一个工具可以做这样的事情,那就太好了!

(或者,我可以只使用 Excel。)

too*_*o42 12

这可以输出制表符分隔文件的漂亮打印版本

column -t -s $'\t' list-of-entries.txt
Run Code Online (Sandbox Code Playgroud)


pet*_*ohn 8

在 vim 中打开文件并将制表位设置为高位,因此列将对齐。如果你不熟悉vim,首先启动它:

vim some_file.csv
Run Code Online (Sandbox Code Playgroud)

然后将制表位设置为某个较高的值,这样列就会对齐。类型:

:set tabstop=20
Run Code Online (Sandbox Code Playgroud)

如果行变得太长,您还应该关闭环绕,这样您就可以横向滚动而不是环绕文本:

:set nowrap
Run Code Online (Sandbox Code Playgroud)

四处走动:有多种方法,但最直接的方法如箭头键和 pgup/pgdown/home/end 将起作用。其他一些有用的移动命令:

CTRL+U: move half screen up
CTRL+D: move half screen down
gg: move to top
G: move to bottom
Run Code Online (Sandbox Code Playgroud)

您可以像在 man 中一样搜索文本:

/regular_expression (search forward)
?regular_expression (search backward)
Run Code Online (Sandbox Code Playgroud)

然后键入“n”查找下一个匹配项,键入“N”查找前一个匹配项。

如果您的终端支持,您也可以使用鼠标导航,然后键入:

:set mouse=a
Run Code Online (Sandbox Code Playgroud)

编辑:我忘了你可以退出:

:q (if you haven't changed the text)
:wq (to save it before quitting)
:q! (to abandon changes)
Run Code Online (Sandbox Code Playgroud)


Den*_*son 7

有一个 Unix 文本模式电子表格sc,它可能对您有用。您可能需要传递文件psc以将其转换为使用的文件格式sc


pet*_*ohn 6

还有另一种解决方案,它涉及脚本。例如,将此脚本保存到tab.pl.

#!/usr/bin/perl

use strict;

my @lines;
# first read the file into a list of lists
while (<>)
{
    chomp; # remove the newline from the end of the line
    my @fields = split("\t");
    push @lines, \@fields;
}
my @lengths;
# calculate the maximum lengths of each field
foreach (@lines)
{
    for (my $i = 0; $i < scalar @$_; $i++)
    {
        $lengths[$i] = $lengths[$i] < length $$_[$i] ? length $$_[$i] : $lengths[$i];
    }
}
# now print the text aligned
foreach (@lines)
{
    for (my $i = 0; $i < scalar @$_; $i++)
    {
        print $$_[$i], " " x ($lengths[$i] - length ($$_[$i]) + 1);
    }
    print "\n";
}
Run Code Online (Sandbox Code Playgroud)

然后只需键入:

perl tab.pl some_file.csv | less
Run Code Online (Sandbox Code Playgroud)

或者将结果保存到文件中并使用您喜欢的文本编辑器打开它:

perl tab.pl some_file.csv > result.txt
Run Code Online (Sandbox Code Playgroud)