Como posso padronizar os números de telefone em um arquivo de texto?

0

Recebo periodicamente um arquivo de texto com números de telefone formatados de formas muito diferentes: ########## , ###-###-#### , (###) ###-### , etc. Geralmente há dez dígitos, mas eu vi +1 (###) ###-#### .

Eventualmente, o arquivo é importado para um banco de dados, mas por motivos que não vou entrar, seria útil ter os números de telefone com um formato padrão, (###) ###-#### .

A única constante é que os números de telefone sempre ficam entre o segundo e o terceiro caractere de tabulação em cada linha.

Existe uma maneira de fazer isso a partir da linha de comando?

    
por Chuck 04.05.2018 / 01:47

3 respostas

1

Isso deve cobrir você, desde que o arquivo seja como você descreveu. O comando preserva as informações antes e depois do número de telefone e as formata da maneira que você pediu. Se a saída parecer boa, adicione a opção -i a sed para editá-la ou forneça o redirecionamento de saída usando > output_file no final.

sed -E "s/(.*\t.*\t)\+?1?[[:space:]]?\(?([0-9]{3})\)?.*([0-9]{3}).*([0-9]{4})(.*)/\(\)\ -/g" filename

Eu testei em um arquivo contendo este texto:

    jfk 902-765-9292 hat jump cat
    jk  902 819 2244 hat jump cat
    98  902 823-4456 hat jump cat
    78h +1 075 242 1566 hat jump cat
jklj    kjlj    +1 075-242-1566 hat jump cat
jk  jkj +1 (075) 242-1566 hat jump cat
    kj  (204) 799-9810 hat jump cat
kj  89  (204)-799-9810 hat jump cat

A saída foi:

    jfk (902) 765-9292 hat jump cat
    jk  (902) 819-2244 hat jump cat
    98  (902) 823-4456 hat jump cat
    78h (075) 242-1566 hat jump cat
jklj    kjlj    (075) 242-1566 hat jump cat
jk  jkj (075) 242-1566 hat jump cat
    kj  (204) 799-9810 hat jump cat
kj  89  (204) 799-9810 hat jump cat
    
por 04.05.2018 / 03:30
1

Você pode construir uma expressão regular que corresponda a qualquer um dos formatos e capturar os dígitos e substituí-los novamente no formato desejado.

Por exemplo, para corresponder e capturar uma sequência de três dígitos decimais, opcionalmente cercada por parênteses com uma expressão regular estendida (ERE), você pode escrever \(?([0-9]{3})\)? , enquanto [- ]? corresponde a um hífen ou espaço opcional. Construindo assim

\(?([0-9]{3})\)?[- ]?([0-9]{3})[- ]?([0-9]{4})

corresponderá a 3 dígitos opcionalmente entre parênteses, opcionalmente seguido por um hífen ou espaço, depois mais dígitos, opcionalmente seguidos por um hífen ou espaço, seguido por 4 dígitos.

Aplicando a expressão em uma substituição sed :

$ cat <<EOF | sed -E 's/\(?([0-9]{3})\)?[- ]?([0-9]{3})[- ]?([0-9]{4})/() -/g'
I periodically receive a text file with phone numbers formatted 
in wildly different ways: 123 456-7890, 123 456-7890, 123 456-7890, 
etc. Usually there's ten digits, but I've seen +1 555 456-7890.
EOF
I periodically receive a text file with phone numbers formatted 
in wildly different ways: (123) 456-7890, (123) 456-7890, (123) 456-7890, 
etc. Usually there's ten digits, but I've seen +1 (555) 456-7890.
    
por 04.05.2018 / 03:18
1

Você precisa corresponder ao campo e reformatá-lo; aqui está um script do awk que procura por três variações e as re-formata (antes da impressão padrão da linha reconstituída):

$3 ~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/ {
        $3="(" substr($3, 1, 3) ") " substr($3, 4, 3) "-" substr($3, 7, 4)
}

$3 ~ /^[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$/ {
        $3="(" substr($3, 1, 3) ") " substr($3, 5, 3) "-" substr($3, 9, 4)
}

$3 ~ /^\+1 \([0-9][0-9][0-9]\) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$/ {
        $3="(" substr($3, 5, 3) ") " substr($3, 10, 3) "-" substr($3, 14, 4)
}

1

Salve isso em um arquivo, talvez phone.awk e, em seguida, chame-o com: awk -F $'\t' -f phone.awk < input .

    
por 04.05.2018 / 04:05