저는 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évrier
2바이트로 인코딩된 로캘 )에서는 fr_FR.UTF-8
멀티바이트를 지원하지 않는 구현을 사용하면 é
정렬이 꺼질 수 있습니다 .awk
mawk
예를 들어 다음과 같은 결과를 얻습니다.
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