파일은 다음과 같습니다.
project2.전화:
Dave,7348389800
Barry,3131234567
Carl,2483445576
Marci,3134491390
Tom,2484962204
Alden,6165564458
프로젝트2.일:
Barry,tuesday
Carl,friday
Tom,sunday
Alden,wednesday
Dave,thursday
Marci,saturday
내 출력은 다음과 같습니다
Day Name Phone
____________________________________
SUNDAY Tom 2484962204
MONDAY Nobody
TUESDAY Barry 3131234567
WEDNESDAY Alden 6165564458
THURSDAY Dave 7348389800
FRIDAY Carl 2483445576
SATURDAY Marci 3134491390
SUNDAY Tom 2484962204
다음과 같은 출력이 필요합니다.
Day Name Phone
____________________________________
SUNDAY Tom (248)496-2204
MONDAY Nobody
TUESDAY Barry (313)123-4567
WEDNESDAY Alden (616)556-4458
THURSDAY Dave (734)838-9800
FRIDAY Carl (248)344-5576
SATURDAY Marci (313)449-1390
SUNDAY Tom (248)496-2204
전화번호를 올바른 형식으로 가져올 수 없습니다.
내가 사용할 때만 작동합니다.awk -F, -f project2.ksh project2.phone project2.day.
출력을 얻으려면 ksh project2.ksh를 실행할 수 있어야 합니다.
스크립트는 다음과 같습니다.
프로젝트2.ksh
BEGIN { split("SUNDAY;MONDAY;TUESDAY;WEDNESDAY;THURSDAY;FRIDAY;SATURDAY", week, ";") }
FNR == NR { name2phone[$1] = gensub(/([0-9]{3})([0-9]{3})(.*)/, "(\\1) \\2-\\3", "g", $2 )
next
}
{ day2name[toupper($2)] = $1 }
END { fmtstr= "%-10s\t%s\t%s\n"
printf(fmtstr,"Day","Name","Phone")
print "____________________________________"
for(d=1;d< length(week); d++ )
{
cname = (week[d] in day2name ) ? day2name[ week[d] ] : "NOBODY"
printf( fmtstr, week[d], cname, name2phone[ cname])
}
}
답변1
GNU awk에 대한 몇 가지 아이디어:
$ awk '{match($0,/(...)(...)(.*)/,a);printf("(%s)%s-%s\n",a[1],a[2],a[3])}' <<<"333456789"
(333)456-789
$ awk '{match($0,/(...)(...)(.*)/,arr);printf( "(" arr[1] ")" arr[2] "-" arr[3])}' <<<"333456789"
(333)456-789
$ awk '{a=$0;printf("(%s)%s-%s\n",substr(a,1,3),substr(a,4,3), substr(a,7))}' <<<"333456789"
(333)456-789
스크립트에 맞게 조정하려면 다음을 시도해 보세요.
마지막 스크립트 줄 바꾸기:
printf( fmtstr, week[d], cname, name2phone[ cname])
다음과 같이 하면 정상적으로 작동합니다.
ph=name2phone[ cname];
match(ph,/(...)(...)(.*)/,arr);
printf( fmtstr, week[d], cname, "(" arr[1] ")" arr[2] "-" arr[3])
답변2
{
raw=$3; //or whichever column the phone# is in
area=substr(raw,1,3);
prefix=substr(raw,4,3);
suffix=substr(raw,7);
print $1, $2, "("area")"prefix"-"suffix
}
나를 위해 일한다
답변3
perl -F, -lane '
@ARGV and $Phone_of{$F[0]} = $F[1] =~ s/(...)(...)(.*)/($1)$2-$3/r;
@ARGV or $Person_of{uc $F[1]} = $F[0];
END {
$fmt = join "\t", map { qq/%${_}s/ } qw/ -10 1 1 /;
print sprintf $fmt, qw/ Day Name Phone /;
print "_" x 37;
for my $day ( map { uc($_ . day) } qw/ sun mon tues wednes thurs fri satur / ) {
print sprintf $fmt, $day, $Person_of{$day} || "Nobody", $Phone_of{$Person_of{$day}};
}
}
' project2.phone project2.day
먼저 해시를 %Phone_of
이름으로 키로 채우고 전화번호 값을 지정합니다. 다음으로, @ARGV
0이 되면, 즉 마지막 파일(.day)이 처리되는 경우 대문자 %Person_of
날짜의 키와 해당 날짜에 작업하는 사람의 값으로 해시를 채웁니다.
블록 에서 END{...}
두 파일이 모두 처리되면 먼저 형식 문자열을 설정하고 이를 사용하여 헤더를 인쇄합니다. 마지막으로, 요일(대문자)을 반복하고 요일, 해당 날짜에 일하는 사람(또는 해당 날짜에 아무도 일하지 않는 경우 아무도 없음) 및 그 사람의 전화번호를 표시합니다.
결과:
Day Name Phone
_____________________________________
SUNDAY Tom (248)496-2204
MONDAY Nobody
TUESDAY Barry (313)123-4567
WEDNESDAY Alden (616)556-4458
THURSDAY Dave (734)838-9800
FRIDAY Carl (248)344-5576
SATURDAY Marci (313)449-1390
주의사항
No whitespace(s) in the input files (*.phone, *.day)