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_of
mit Schlüsseln als Namen und Werten als Telefonnummern auf. Als nächstes, wenn @ARGV
Null erreicht ist, d. h. die letzte Datei (.day) verarbeitet wird, füllen wir den Hash %Person_of
mit 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)