결과:

결과:

파일은 다음과 같습니다.

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이름으로 키로 채우고 전화번호 값을 지정합니다. 다음으로, @ARGV0이 되면, 즉 마지막 파일(.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)

관련 정보