Estos son los archivos:
proyecto2.teléfono:
Dave,7348389800
Barry,3131234567
Carl,2483445576
Marci,3134491390
Tom,2484962204
Alden,6165564458
proyecto2.día:
Barry,tuesday
Carl,friday
Tom,sunday
Alden,wednesday
Dave,thursday
Marci,saturday
Mi salida se ve así:
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
Necesito que el resultado se vea así:
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
No consigo obtener los números de teléfono en el formato correcto.
Sólo funciona cuando usoawk -F, -f proyecto2.ksh proyecto2.teléfono proyecto2.día.
Necesito poder ejecutar ksh project2.ksh para obtener el resultado.
Este es el guión:
proyecto2.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])
}
}
Respuesta1
Algunas ideas con 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
Para adaptarlo a tu script prueba este:
Reemplazando la última línea del script:
printf( fmtstr, week[d], cname, name2phone[ cname])
Con lo siguiente, debería funcionar bien:
ph=name2phone[ cname];
match(ph,/(...)(...)(.*)/,arr);
printf( fmtstr, week[d], cname, "(" arr[1] ")" arr[2] "-" arr[3])
Respuesta2
{
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
}
funciona para mi
Respuesta3
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
Primero llenamos el hash %Phone_of
con claves como nombres y valoramos sus números de teléfono. A continuación, cuando @ARGV
se ha vuelto cero, es decir, se está procesando el último archivo (.día), completamos el hash %Person_of
con claves como día en mayúscula y valor como persona que trabaja ese día.
En el END{...}
bloque, cuando ambos archivos han sido procesados, primero configuramos la cadena de formato y, con ella, imprimimos el encabezado. Finalmente, recorremos los días de la semana (en mayúsculas) y mostramos el día, la persona que trabaja ese día (o nadie si nadie trabaja ese día) y el número de teléfono de la persona.
Resultado:
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
Advertencias
No whitespace(s) in the input files (*.phone, *.day)