我有以下输出:
Person 49
Persons Boss 3
HR 21
CEO 93
System Administrator 2
使用column -t
会产生以下输出:
Person 49
Persons Boss 3
HR 21
CEO 93
System Administrator 2
正如你所看到的,这看起来不太好。我需要输出如下所示:
Person 49
Persons Boss 3
HR 21
CEO 93
System Administrator 2
有人知道这是如何生产的吗?
答案1
将列分隔符更改为例如Tab比使用column
:
output | sed 's/\S\+\s*$/\t&/' | column -t -s $'\t'
答案2
这是 awk 中的一个解决方案,可以动态确定所需的列宽。每行可以包含任意数量的字段,但它假设最终字段是整数。根据需要,整数的格式设置为在右侧排列。
格式.awk
#!/usr/bin/awk -f
# Format text and numbers into two columns
# Written by PM 2Ring 2015.04.16
#Gather data, line by line
{
#Split name from number
match($0, /^(.*) ([0-9]+)[[:space:]]*$/, a)
#printf "%d: %s -> [%s] [%s]\n", NR, $0, a[1], a[2]
#Store name & number into arrays
name[NR] = a[1]
num[NR] = a[2]
#Update field widths
namelen = length(a[1])
if (namelen > maxname)
maxname = namelen
numlen = length(a[2])
if (numlen > maxnum)
maxnum = numlen
}
#Print re-formatted data
END{
for(i=1; i<=NR; i++)
#Use printf's '*' modifier to specify field widths
printf "%-*s %*d\n", maxname, name[i], maxnum, num[i]
}
输出
Person 49
Persons Boss 3
HR 21
CEO 93
System Administrator 2
您可以像这样调用脚本:
$ awk -f format.awk data_filename
您还可以将文本数据通过管道传输到其中。如果您使用chmod
赋予它执行权限,您可以像任何其他命令一样运行它。
显然,这比 Costa 的解决方案(用于sed
预处理column
.所以我建议使用它,除非你真的希望数字右对齐。 :) OTOH,虽然这个脚本看起来比 Costa 的单行程序更大,awk
速度非常快,因此我预计该解决方案的速度与 Costa 的相当,即使数据文件非常大。
答案3
您可以通过将最后一个归档的变量保存到一个新变量,然后将其原始指针设置为空字符串,然后打印 $0 和您保存的最后一个归档的变量来通过一行完成此操作。
(echo a b c 10; echo x y 2 ; echo x 1) \
| awk '{lastf=$NF ; $NF="" ; print $0,", "lastf}' \
| column -ts,
# output
a b c 10
x y 2
x 1