使用awk均匀地标记打印的字段

时间:2015-01-10 05:35:08

标签: shell awk

我需要使用awk的帮助。感谢

我有一个包含以下内容的文件

text.txt  
The Hunger Games:Suzanne Collins:1:2:3
Weapon X:Stan Lee:3:4:5

我用来打印行的代码

awk -F '[:]' '{print $1, $2 ,"$"$3, $4 , $5 }' BookDB.txt 

我希望外线变得像这样

The Hunger Games     Suzanne Collins      1     2     3
Weapon X             Stan Lee             3     4     5

3 个答案:

答案 0 :(得分:1)

您可以将awk输出管道输出到column,如下所示:

awk -F ':' -v OFS=':' '{print $1, $2 , $3, $4 , $5}' BookDB.txt | column -s ':' -t
The Hunger Games  Suzanne Collins  1  2  3
Weapon X          Stan Lee         3  4  5

答案 1 :(得分:1)

您显示的输出不是以制表符分隔的,而是将其格式化为表格,为此您只需要:

$ column -t -s: file
The Hunger Games  Suzanne Collins  1  2  3
Weapon X          Stan Lee         3  4  5

如果你真的希望它以制表符分隔,那就是:

$ tr ':' '\t' < file
The Hunger Games        Suzanne Collins 1       2       3
Weapon X        Stan Lee        3       4       5

如果您想要特定字段:

$ cut -d':' -f 1,4 file | column -t -s:
The Hunger Games  2
Weapon X          4

$ cut -d':' -f 1,4 file | tr ':' '\t'
The Hunger Games        2
Weapon X        4

$ awk -F':' -v OFS='\t' '{print $1, $4}' file
The Hunger Games        2
Weapon X        4

如果您没有column但需要表格输出,则可以在awk中完成所有操作:

$ cat tst.awk
BEGIN { FS = ":"; ARGV[ARGC] = ARGV[ARGC-1]; ARGC++ }
{
    for (i=1; i<=NF; i++)
        if (NR==FNR)
            width[i] = (length($i) > width[i] ? length($i) : width[i])
        else
            printf "%-*s%s", width[i], $i, (i<NF?OFS:ORS)
}

$ awk -f tst.awk file
The Hunger Games Suzanne Collins 1 2 3
Weapon X         Stan Lee        3 4 5

答案 2 :(得分:0)

尝试使用此选项来获取标签间距:如示例所示:

awk -F: '{if(NR==2)$2="\t"$2;print $1, $2, $3, $4, $5}' OFS="\t" BookDB.txt

:设置为字段分隔符,将\t设置为输出字段分隔符。然后,对于第二行(NR==2),为第二个字段添加one extra tab。然后打印字段。

甚至更简单(如果您可以接受):

sed "s/:/\t/g" BookDB.txt