首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Nawk文件打印表

如何从Nawk文件打印表
EN

Unix & Linux用户
提问于 2020-12-01 16:25:31
回答 1查看 78关注 0票数 0

我正在尝试从格式化为表的文件中打印信息。到目前为止

代码语言:javascript
复制
BEGIN {
    OFS = "\t";
    FS = ":";
    print "\t\t----Employee Information---- ";
    printf("%s %40s %20s %4s %8s %4s %15s \n", "NAME", "TELEPHONE", "AGE", "|", "Salary", "|", "License No.")
}
{ printf ("%s %30s %30s %30s %30s\n", $4, $1, $5, $2, $3) }

它负责处理列,但我似乎无法按我所希望的方式排列数据。

下面是我必须输出的数据示例:

代码语言:javascript
复制
{246} 548-1278:2500:175A106:Miss Cherise Hilton-Moore : 30
{408} 538-2358:1550:201B154:Mr Reynold Watson :37
{210} 655-6279:2600:509UYT6:Miss Natalie Judy-Sealy :32
{210} 548-1348:2500:175XCVD3:Mr John McCollin : 26
{208} 548-1278:1880:150P9URE:Mr Ronald Francis: 31

有区号,电话号码,工资,驾照号码,姓名,年龄。我想把它列在栏下:

代码语言:javascript
复制
Name       Telephone        Age       Salary      License Number.

但是,我得到的输出如下:

代码语言:javascript
复制
NAME                                TELEPHONE                  AGE    |   Salary    |     License No.
Miss Cherise Hilton-Moore                  {246} 548-1278  30                           2500                        175A106
Mr Reynold Watson                  {408} 538-2358  37                           1550                        201B154
Miss Natalie Judy-Sealy                  {210} 655-6279  32                           2600                        509UYT6

编辑:首先,感谢大家的指导。到目前为止,这就是我所拥有的:

代码语言:javascript
复制
BEGIN {FS = ":";
print "\t\t----Employee Information---- ";
printf("%s %40s %20s %4s %8s %4s %15s \n", "NAME", "TELEPHONE", "AGE", "|", "Salary", "|", "License No.")}\
{printf ("%-35s %-26s %-10s %-15s %-10s\n", $4, $1, $5, $2, $3)}

#End of Script

在一般情况下,它不会起作用。我会继续看,但是,这是基于我对说明的理解。

EN

回答 1

Unix & Linux用户

发布于 2020-12-01 18:27:36

代码语言:javascript
复制
$ cat tst.awk
BEGIN {
    ARGV[ARGC] = ARGV[ARGC-1]   # So we can read the input twice, first to get the max field widths.
    ARGC++

    # Not using character class [:blank:] because nawk does not support character classes
    FS = "[ \t]*:[ \t]*"

    split("TELEPHONE:SALARY:LICENSE NO.:NAME:AGE",inNr2Name)
    for (inNr in inNr2Name) {
        name = inNr2Name[inNr]
        wid  = length(name)
        name2wid[name] = wid
        f[name] = inNr                  # field name to input field number
    }

    print "\t\t----Employee Information---- "
}
NR==FNR {
    for (inNr=1; inNr<=NF; inNr++) {
        name = inNr2Name[inNr]
        val  = $inNr
        wid  = length(val)
        name2wid[name] = (name2wid[name] > wid ? name2wid[name] : wid)
    }
    next
}
FNR == 1 {
    outFmt = "%-" name2wid["NAME"]      "s "    \
             "%-" name2wid["TELEPHONE"] "s "    \
             "%-" name2wid["AGE"]       "s "    \
             "| "                               \
             "%-" name2wid["SALARY"]    "s "    \
             "| "                               \
             "%-" name2wid["LICENSE NO."] "s\n"

    printf outFmt, "NAME", "TELEPHONE", "AGE", "SALARY", "LICENSE NO."
}
{
    printf outFmt, $(f["NAME"]), $(f["TELEPHONE"]), $(f["AGE"]), $(f["SALARY"]), $(f["LICENSE NO."])
}
代码语言:javascript
复制
$ awk -f tst.awk file
                ----Employee Information----
NAME                      TELEPHONE      AGE | SALARY | LICENSE NO.
Miss Cherise Hilton-Moore {246} 548-1278 30  | 2500   | 175A106
Mr Reynold Watson         {408} 538-2358 37  | 1550   | 201B154
Miss Natalie Judy-Sealy   {210} 655-6279 32  | 2600   | 509UYT6
Mr John McCollin          {210} 548-1348 26  | 2500   | 175XCVD3
Mr Ronald Francis         {208} 548-1278 31  | 1880   | 150P9URE

我使用了许多中间变量,所有这些变量都有有意义的名称,所以我希望您能够在经过一番思考并查看手册页之后,了解它所做的事情,但如果不是,那么就可以随意发布问题了。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/622380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档