월 번호를 월 이름으로 수정하고 같은 달의 행에 대해 한 번 인쇄합니다.

월 번호를 월 이름으로 수정하고 같은 달의 행에 대해 한 번 인쇄합니다.

저는 awk 프로그래밍의 초보자입니다. 다음과 같이 설명하고 싶습니다.

나는 가지고있다:

month D1 D2 D3
01    25 26 23
01    13 12 11
01    48 45 12
02    77 87 45
02    63 99 12

나는 원해요:

month D1 D2 D3
January 25 26 23
        13 12 11
        48 45 12
February 77 87 45
         63 99 12

답변1

zsh(사용자 로케일의 월 이름 목록 가져오기) + 를 사용하세요 awk. 아마도 다음과 같습니다.

zmodload zsh/langinfo
awk -v months=${(vj[:])langinfo[(I)MON_<1-12>]} '
  BEGIN{split(months, month, ":")}
  NR > 1 {
    this_month = month[0+$1]
    if (this_month == last)
      $1 = blanks
    else
      blanks = sprintf("%*s", length(last = $1 = this_month), "")
  }
  {print}' < your-file

월 이름에 여러 바이트로 인코딩된 문자가 포함된 로캘(예: février2바이트로 인코딩된 로캘 )에서는 fr_FR.UTF-8멀티바이트를 지원하지 않는 구현을 사용하면 é정렬이 꺼질 수 있습니다 .awkmawk

예를 들어 다음과 같은 결과를 얻습니다.

month D1 D2 D3
janvier 25 26 23
        13 12 11
        48 45 12
février 77 87 45
        63 99 12

와 함께 gawk, 그러나

month D1 D2 D3
janvier 25 26 23
        13 12 11
        48 45 12
février 77 87 45
         63 99 12

그리고 mawk.

사용자의 로케일에 관계없이 월 이름을 영어로 표시하려는 경우 설정할 수 있습니다 LC_ALL=C.

답변2

또한 시도

awk '
NR == 1         {split($0, Month, ";")
                 next
                }
FNR > 1         {Tmp  = $1
                 $1   = Month[$1+0]
                 if (Tmp == Last) gsub(/./, " ", $1)
                 Last = Tmp
                }
1
' - file <<< $(LC_ALL=C locale mon)
month D1 D2 D3
January 25 26 23
        13 12 11
        48 45 12
February 77 87 45
         63 99 12

명령에서 월 이름을 가져와 locale숫자 $1를 이름으로 변환하고 중복된 이름에 해당 공백 수를 채웁니다.

답변3

문서:months.awk

#! /usr/bin/awk -f

BEGIN {
    # Months array initialization
    months["01"] = "January"
    months["02"] = "February"
    months["03"] = "March"
    months["04"] = "April"
    months["05"] = "May"
    months["06"] = "June"
    months["07"] = "July"
    months["08"] = "August"
    months["09"] = "September"
    months["10"] = "October"
    months["11"] = "November"
    months["12"] = "December"
}
{
    # key is the month number
    k = $1
}
! (k in months) {
    # Month not found: print line as is
    print
    # Next line!
    next
}
! (k in tabs) {
    # month name read from array
    month_name = months[k]
    # month name length
    month_len = length(month_name)
    # remove month number into the line
    gsub(/^[0-9]+ +/, "")
    # print new line
    printf("%*.*s %s\n", month_len, month_len, month_name, $0)
    # store in tabs array the month length
    tabs[k] = month_len
    # Next line!
    next
}
{
    # remove month number into the line
    gsub(/^[0-9]+ +/, "")
    # print new line
    printf("%*.*s %s\n", tabs[k], tabs[k], "", $0)
}

라고 불리는:

awk -f months.awk your_filename

또는 이미 완료한 경우 chmod 755 months.awk:

./months.awk your_filename

답변4

GNU awk를 사용하여 시간 함수를 구현합니다.

$ awk '
    NR==1 { mth = $1 }
    NR>1  { mth = ($1==prev ? "" : strftime("%B",mktime("2020 " $1 " 15 12 0 0 0"))); prev=$1 }
    { $1 = sprintf("%-9s",mth); print }
' file
month     D1 D2 D3
January   25 26 23
          13 12 11
          48 45 12
February  77 87 45
          63 99 12

또는 awk를 사용하십시오.

$ awk '
    BEGIN { split("January February March April May June July August September October November December",mths) }
    NR==1 { mth = $1 }
    NR>1  { mth = ($1==prev ? "" : mths[$1+0]); prev=$1 }
    { $1 = sprintf("%-9s",mth); print }
' file
month     D1 D2 D3
January   25 26 23
          13 12 11
          48 45 12
February  77 87 45
          63 99 12

관련 정보