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

나는 모두 의미 있는 이름을 가진 많은 중간 변수를 사용하고 있습니다. 따라서 여러분이 잠시 생각하고 매뉴얼 페이지를 살펴본 후에 이것이 무엇을 하는지 이해하기를 바랍니다. 하지만 그렇지 않은 경우에는 자유롭게 질문하십시오.

관련 정보