テキストファイルの電話番号を正規化する方法は?

テキストファイルの電話番号を正規化する方法は?

##########定期的にさまざまな形式(、など)の電話番号###-###-####を含むテキストファイルを受け取ります。(###) ###-###通常10桁ですが、そんなことも見たことがあります+1 (###) ###-####

結局のところ、ファイルはデータベースにインポートされましたが、詳細には説明しないため、電話番号は標準形式で指定されました(###) ###-####

変更されない唯一のことは、電話番号が常に各行の2番目と3番目のタブ文字の間にあることです。

コマンドラインでこれを行う方法はありますか?

答え1

文書が説明通りの場合、この内容も適用されます。このコマンドは電話番号の前後の情報を保存し、必要な方法でフォーマットします。出力が良く見える場合は、その場所で編集する-iオプションを追加するか、最後に使用して出力リダイレクトを提供してください。sed> output_file

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

次のテキストを含むファイルでテストしました。

    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

出力は次のとおりです

    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

答え2

すべての形式に一致し、数値をキャプチャしてから、目的の形式に置き換える正規表現を作成できます。

たとえば、拡張正規表現(ERE)を使用して、オプションで括弧で囲まれた10進数3桁のシーケンスを一致させてキャプチャするには、一致する項目にオプションのハイフンまたはスペースを書き込むことが\(?([0-9]{3})\)?できます。[- ]?このように建てられました

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

括弧内の3桁の数字(オプション)と一致し、オプションでハイフンまたはスペースが続き、追加の数字(オプションでハイフンまたはスペースが続く)と4桁の数字が一致します。

置換に式を適用sed:

$ cat <<EOF | sed -E 's/\(?([0-9]{3})\)?[- ]?([0-9]{3})[- ]?([0-9]{4})/(\1) \2-\3/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.

答え3

フィールドを一致させ、書式を再指定する必要があります。以下は、3つのバリエーションを見つけてフォーマットを再指定するawkスクリプトです(デフォルトで再編成された行を印刷する前)。

$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

ファイル(たとえば)に保存したら、phone.awk次のように呼び出しますawk -F $'\t' -f phone.awk < input

関連情報