Nawkファイルからテーブルを印刷する方法

Nawkファイルからテーブルを印刷する方法

テーブル形式のファイルから情報を印刷しようとしています。今まで

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) }

列を管理していますが、データを好きなように整理できないようです。

以下は、出力する必要があるデータの例です。

{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

順番に地域番号、電話番号、給与、ライセンス番号、名前、年齢順です。列の下に並べ替えたいです。

Name       Telephone        Age       Salary      License Number.

しかし、私が得た結果は次のとおりです。

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

編集者:まず、指導してくれた皆さんに感謝します。これが私が今まで持っているものです:

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

一般的に動作するとは言いません。探し続けますが、これは私の指定者の理解に基づいています。

ベストアンサー1

$ 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."])
}

$ 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

私はすべて意味のある名前を持つ多くの中間変数を使用しています。したがって、あなたがしばらく考えて、マニュアルページを見た後、これが何をしているのかを理解してください。しかし、そうでない場合は、自由に質問してください。

おすすめ記事