텍스트 파일의 전화번호를 정규화하는 방법은 무엇입니까?

텍스트 파일의 전화번호를 정규화하는 방법은 무엇입니까?

##########정기적으로 다양한 형식( , 등) 의 전화번호 ###-###-####가 포함된 텍스트 파일을 받습니다. (###) ###-###보통 10자리인데 그런 것도 본 적 있어요 +1 (###) ###-####.

결국 파일은 데이터베이스로 가져왔지만 자세히 설명하지 않기 때문에 전화번호는 표준 형식으로 지정되었습니다 (###) ###-####.

변경되지 않는 유일한 점은 전화번호가 항상 각 줄의 두 번째와 세 번째 탭 문자 사이에 있다는 것입니다.

명령줄에서 이 작업을 수행할 수 있는 방법이 있나요?

답변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

필드를 일치시키고 형식을 다시 지정해야 합니다. 다음은 세 가지 변형을 찾아서 형식을 다시 지정하는 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.

관련 정보