从文本输出创建列,但具有多个单词列

从文本输出创建列,但具有多个单词列

我有以下输出:

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

相关内容