POSIX 相当于列 -t

POSIX 相当于列 -t

我最近惊讶地发现 POSIX 列表 公用事业不包括 column 公用事业。 column最早出现在 4.3BSD 中,而且它非常有用。有 POSIX 等价的吗?


我想替换的确切命令是:

$ 更多 -- ./tmp.txt
1 个小 000a
2 非常_非常_非常_非常_长 000b
3 小 000c
$列-t --./tmp.txt
1 个小 000a
2 非常_非常_非常_非常_长 000b
3 小 000c
$

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

答案1

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

与任何其他文本实用程序一样,您可以通过适当的工作量用 awk 来表达它。这是经过最低限度测试的column -t.在简单情况下(只有一个字符),awk 的选项与s-F类似。column-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];
    }
}

答案2

pr做了很多事情column。如果您指定实际的命令行,我们可以使用替换命令行。

名称 pr - 转换文本文件以进行打印

概要 [选项]...[文件]...

描述 对文件进行分页或分栏以便打印。

对于您的特定情况,您可以使用awk

awk '{printf("%2s %30s %10s", $1, $2, $3);}' file.txt

请注意,宽度说明符 2、30 和 10 是硬编码的,您必须选择输入的值,或读取文件两次(一次获取每列的最大宽度,第二次使用您输入的值打印出来)得到)。

答案3

column据我所知,POSIX 实用程序集中没有直接等效的工具。

一个可能的(便宜的)POSIX 解决方案可能是:

$ tr -s ' ' '\n' <<"EOT" | pr -3 -a -t
1   SMALL   000a
2   VERY_VERY_VERY_VERY_LONG    000b
3   SMALL   000c
EOT
1                       SMALL                   000a
2                       VERY_VERY_VERY_VERY_LON 000b
3                       SMALL                   000

复制/粘贴后,您的示例数据的字段以空格分隔。如果它们实际上被单个分隔开TAB,您可以使用tr '\t' '\n'.

当然,这假设所有输入行具有相同数量的字段。相当明显的缺点是列的大小均匀,这使得它们看起来明显不如column -t.

此外,如上面的示例所示,pr对行使用固定长度(默认为 72 个字符),并截断不适合其列宽度的字段。然后可能需要显式地将页面宽度 ( -w) 设置为合适的值。

相关内容