Ergebnis:

Ergebnis:

Dies sind die Dateien:

projekt2.telefon:

  Dave,7348389800
  Barry,3131234567
  Carl,2483445576
  Marci,3134491390
  Tom,2484962204
  Alden,6165564458 

projekt2.tag:

  Barry,tuesday
  Carl,friday
  Tom,sunday
  Alden,wednesday
  Dave,thursday
  Marci,saturday

Meine Ausgabe sieht folgendermaßen aus:

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

Die Ausgabe muss folgendermaßen aussehen:

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

Ich kann die Telefonnummern nicht im richtigen Format abrufen.

Es funktioniert nur, wenn ich benutzeawk -F, -f projekt2.ksh projekt2.telefon projekt2.tag.

Ich muss ksh project2.ksh ausführen können, um die Ausgabe zu erhalten.

Dies ist das Skript:

projekt2.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])
                     }
      }

Antwort1

Einige Ideen mit 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

Um es an Ihr Skript anzupassen, versuchen Sie Folgendes:

Ersetzen Sie Ihre letzte Skriptzeile:

printf( fmtstr, week[d], cname, name2phone[ cname])

Mit dem Folgenden sollte es klappen:

ph=name2phone[ cname];
match(ph,/(...)(...)(.*)/,arr);
printf( fmtstr, week[d], cname, "(" arr[1] ")" arr[2] "-" arr[3])

Antwort2

{
  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 
}

funktioniert bei mir

Antwort3

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

Wir füllen den Hash zunächst %Phone_ofmit Schlüsseln als Namen und Werten als Telefonnummern auf. Als nächstes, wenn @ARGVNull erreicht ist, d. h. die letzte Datei (.day) verarbeitet wird, füllen wir den Hash %Person_ofmit Schlüsseln als Tag in Großbuchstaben und Werten als Person, die an diesem Tag arbeitet.

Im END{...}Block, wenn beide Dateien verarbeitet wurden, richten wir zuerst die Formatzeichenfolge ein und drucken damit den Header. Schließlich durchlaufen wir die Wochentage (in Großbuchstaben) und zeigen den Tag, die Person, die an diesem Tag arbeitet (oder niemanden, wenn an diesem Tag niemand arbeitet), und die Telefonnummer der Person an.

Ergebnis:

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

Vorbehalte

No whitespace(s) in the input files (*.phone, *.day)

verwandte Informationen