如何标准化文本文件中的电话号码?

如何标准化文本文件中的电话号码?

我定期收到一个文本文件,其中的电话号码格式各异:#############-###-####(###) ###-###等。通常有十位数字,但我见过+1 (###) ###-####

最终该文件被导入到数据库中,但由于我不会详细说明的原因,让电话号码具有标准格式(###) ###-####.

唯一不变的是电话号码始终位于每行的第二个和第三个制表符之间。

有没有办法从命令行执行此操作?

答案1

只要文件符合您所描述的那样,这应该涵盖您。该命令会保留电话号码前后的信息,并按照您要求的方式对其进行格式化。如果输出看起来不错,请添加选项-ised就地编辑它或> 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) 匹配和捕获可选用括号括起来的三个十进制数字序列,您可以在 matches\(?([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

您需要匹配字段并重新格式化它;这是一个 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

相关内容