슬래시, 대시, 닫는 괄호 등 세 가지 구분 기호를 기반으로 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/-$//
후행 하이픈을 제거하세요.