答案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
) 设置为合适的值。