Como faço para obter números de telefone do arquivo no formato correto usando o awk? Script de trabalho precisa de ajustes

2

Estes são os arquivos:

project2.phone:

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

project2.day:

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

Minha saída é assim:

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

Eu preciso que a saída seja assim:

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

Não consigo obter os números de telefone no formato correto.

Funciona apenas quando uso o awk -F, -f project2.ksh project2.phone project2.day .

Eu preciso ser capaz de executar o ksh project2.ksh para obter a saída.

Este é o script:

project2.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])
                     }
      }
    
por Jaruto 11.04.2017 / 22:41

3 respostas

1

Algumas ideias com o 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 adaptá-lo ao seu script, tente este:

Substituindo sua última linha de script:

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

Abaixo, deve funcionar ok:

ph=name2phone[ cname];
match(ph,/(...)(...)(.*)/,arr);
printf( fmtstr, week[d], cname, "(" arr[1] ")" arr[2] "-" arr[3])
    
por 12.04.2017 / 01:50
0
{
  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 mim

    
por 12.04.2017 / 01:00
0
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

Em primeiro lugar, preenchemos o hash %Phone_of com chaves como nomes e valoriza os seus números de telefone. Em seguida, quando @ARGV for zero, ou seja, o último arquivo (.day) estiver sendo processado, preencheremos o hash %Person_of com chaves como dia em maiúsculas e valor como pessoa trabalhando nesse dia.

No bloco END{...} , quando os dois arquivos foram processados, primeiro configuramos a string de formato e, usando isso, imprimimos o cabeçalho. Finalmente, passamos os dias da semana (em maiúsculas) e exibimos o dia, a pessoa que trabalha naquele dia (ou ninguém, se ninguém estiver trabalhando naquele dia) e o número de telefone da pessoa.

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

Advertências

No whitespace(s) in the input files (*.phone, *.day)
    
por 12.04.2017 / 06:38

Tags