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

Tabbing the printed fields evenly using awk

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

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

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

我用来打印线条的代码

awk -F '[:]' '{print ,  ,"$",  ,  }' BookDB.txt 

希望输出变成这样

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

试试这个来获取制表符间距,如您的示例所示:

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

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

或者更简单(如果你能接受的话):

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

您可以像这样将 awk 输出通过管道传输到 column

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

您显示的输出不是制表符分隔的,它的格式为 table,为此您只需要:

$ 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 , }' 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