POSIX 等效于列 -t

Ain*_*r-G 5 posix text-formatting

我最近惊讶地发现,POSIX 实用程序列表不包括该 column 实用程序。 column最早出现在 4.3BSD 中,它非常有用。是否有 POSIX 等价物?


我要替换的确切命令是:

$ 更多 -- ./tmp.txt 
1 小 000a
2 VERY_VERY_VERY_VERY_LONG 000b
3 小 000c
$ column -t -- ./tmp.txt 
1 小 000a
2 VERY_VERY_VERY_VERY_LONG 000b
3 小 000c
$

也就是说,展开选项卡以创建更漂亮的列。

Gil*_*il' 5

POSIX 更喜欢对现有行为进行编码,并且仅在现有行为不令人满意时才强制要求新功能或未被广泛采用的功能。如今,使用固定宽度字体的无格式文本表示数据的要求并不多,因此column不太可能成为强制性要求。与 不同pr,它来自 BSD,它不存在 System V 和其他历史的 unices,所以它不是祖父。

像任何其他文本实用程序一样,您可以在 awk 中以适度的工作量来表达它。这是column -t. awk 的-v选项类似于简单情况下的column's -s(带有单个字符)。

#!/usr/bin/env awk
{
    if (max_column < NF) max_column = NF;
    for (i = 1; i <= NF; i++) {
        if (width[i] < length($i)) width[i] = length($i);
        data[NR, i] = $i;
    }
}
END {
    for (i = 1; i < max_column; i++) format[i] = sprintf("%%-%ds  ", width[i]);
    format[max_column] = "%s\n";
    for (k = 1; k <= NR; k++) {
        for (i = 1; i <= max_column; i++) printf format[i], data[k, i];
    }
}
Run Code Online (Sandbox Code Playgroud)