옵션 1

옵션 1

슬래시, 대시, 닫는 괄호 등 세 가지 구분 기호를 기반으로 CSV 필드를 세 개의 열로 변환하고 싶습니다.)/-

(031)540-6622
021-886-3877
555/532-2662

이것이 내가 봐야 할 것입니다:

031  540  6622
021   886  3877
555   532   2662

실제로 저는 다음 스키마를 변환하는 간단하고 빠른 방법을 찾고 있습니다.

(###)###-####       \
###-###-####         |---> ###-###-####
###/###-####        /

그런 다음 대시로 구분된 필드를 공백 구분 기호가 있는 세 개의 필드로 변환합니다.

답변1

GNU sed를 사용하세요. 선행을 제거하고 (, 를 공백으로 바꿉니다.-)/

sed 's/^(//; y|-)/|   |' file

산출:

031 5440 6622
021 8886 3877
555 532 2662

답변2

슬래시, 대시, 닫는 괄호 등 세 가지 구분 기호를 기반으로 CSV 필드를 세 개의 열로 변환하고 싶습니다. )/-

awk다음 3개의 구분 기호를 설정 FS하고 3개의 열을 가져와 (첫 번째 열에서 첫 번째 문자를 제거할 수 있습니다 .

awk -v FS='[)-/]' '{gsub(/^\(/,"",$1);print $1,$2,$3}' file
031 540 6622
021 886 3877
555 532 2662

답변3

옵션 1

데이터에 항상 구분 기호가 있는 세 개의 숫자 블록이 포함되어 있는 경우 다음을 수행해야 합니다.

grep -Eo "[0-9]+" phone.txt \
  | paste -d- - - -

이것은 것이다아니요전화번호가 세 블록 떨어져 있으면 제대로 작동합니다. 귀하의 요구 사항 중 하나는 아니지만 작동 방식으로 인해~해야 한다이는 한 줄에 여러 전화번호가 포함되어 있거나 전화번호가 여러 줄에 걸쳐 있는 경우(각 번호에 정확히 세 개의 블록이 포함되어 있는 한) 작동합니다.

무너지다

grep -Eo "[0-9]+" phone.txt

연속된 숫자 블록이 추출되고 결과는 행당 하나의 블록으로 분류됩니다.

paste -d- - - -

각 줄이 하이픈으로 구분된 3개의 블록으로 표시되도록 데이터를 확장합니다.

옵션 2

또는 데이터의 일관성이 떨어지는 경우:

sed -r 's/[^0-9]+/-/g;s/^-//;s/-$//' phone.txt

무너지다

s/[^0-9]+/-/g숫자가 아닌 숫자는 하이픈으로 바꾸세요.

s/^-//모든 선행 하이픈 제거

s/-$//후행 하이픈을 제거하세요.

관련 정보