파일은 다음과 같습니다.
항목 2. 전화번호:
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, -fproject2.kshproject2.phoneproject2.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
먼저 해시를 키로 이름으로 채우고 전화번호로 값을 채웁니다. 그런 다음 0에 도달하면, 즉 마지막 파일(.day)이 처리되는 경우 대문자 날짜에 대한 키와 해당 날짜에 작업하는 사람에 대한 값으로 해시를 채웁니다 @ARGV
.%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)