공백을 쉼표로 바꾸기

공백을 쉼표로 바꾸기

txt로 변환하려는 형식의 파일이 있습니다 csv. 각 필드 사이에 공백 블록이 있습니다. 각 필드 사이의 공백 수는 동일하지 않습니다.

3개 이상의 공백이 있는 블록을 sed 또는 awk를 사용하여 으로 바꾸는 명령이 있습니까 ,? 공백이 2개만 있는 경우 대체되는 데이터에서 이중 공백을 방지하려면 이를 무시해야 합니다.,

입력하다:

A_DRIVERLICENSENUMBER_                                                                                                                                                                                                                                           A_PRIORADDRESS2_                                                                                                                                                                                                                                                 A_MONTHLYRENT_           A_EMPLOYEEID_                                                                                                                                                                                                                                                    A_WORKPHONESPECIALINSTR_                                                                                                                                                                                                                                         A_REFDETAIL_                                                                                                                                                                                                                                                     A_VERBALPLEDGE                                                            
input  example,input2 example

산출:

A_DRIVERLICENSENUMBER_,A_PRIORADDRESS2_,A_MONTHLYRENT_,A_EMPLOYEEID,A_WORKPHONESPECIALINSTR_,A_REFDETAIL_,A_VERBALPLEDGE
input  example,input2 example

인터넷에서 이 작업을 수행하는 방법을 찾을 수 없습니다. 여기 누군가가 나를 도와줄 거라고 확신해요

답변1

당신은 시도 할 수 있습니다:

sed -E 's/[[:space:]]{3,}/,/g' file

또는

perl -pe 's/\s{3,}/,/g' file

답변2

POSIX awk를 사용하십시오.

$ awk -F' {3,}' -v OFS=',' '{$1=$1} 1' file
A_DRIVERLICENSENUMBER_,A_PRIORADDRESS2_,A_MONTHLYRENT_,A_EMPLOYEEID_,A_WORKPHONESPECIALINSTR_,A_REFDETAIL_,A_VERBALPLEDGE,
input  example,input2 example

또는 awk를 사용하여 3개의 공백을 하드코딩한 다음 +FS에 a를 사용합니다.

awk -F'   +' -v OFS=',' '{$1=$1} 1' file

유효한 CSV 출력(행당 동일한 수의 필드)을 원하는 경우 첫 번째 행에 모든 필드가 포함되어 있다고 가정합니다.

$ awk -F',| {3,}' -v OFS=',' 'NR==1{nf=NF} {$nf=$nf} 1' file
A_DRIVERLICENSENUMBER_,A_PRIORADDRESS2_,A_MONTHLYRENT_,A_EMPLOYEEID_,A_WORKPHONESPECIALINSTR_,A_REFDETAIL_,A_VERBALPLEDGE,
input  example,input2 example,,,,,,

또는:

$ awk -F' {3,}' -v OFS=',' 'NR==1{nf=NF} {for (i=1; i<=nf; i++) $i="\"" $i "\""} 1' file
"A_DRIVERLICENSENUMBER_","A_PRIORADDRESS2_","A_MONTHLYRENT_","A_EMPLOYEEID_","A_WORKPHONESPECIALINSTR_","A_REFDETAIL_","A_VERBALPLEDGE",""
"input  example,input2 example","","","","","","",""

,입력의 기존 s를 필드 구분 기호로 처리해야 하는지 여부 에 따라 다릅니다 .

답변3

당신부터 시작하세요샘플 파일, 당신은 그것을 사용할 수 있습니다밀러 6그리고 달리다

mlr --ifs-regex "   +" --csvlite --ragged cat input.txt

얻기 위해

A_DRIVERLICENSENUMBER_,A_PRIORADDRESS2_,A_MONTHLYRENT_,A_EMPLOYEEID_,A_WORKPHONESPECIALINSTR_,A_REFDETAIL_,A_VERBALPLEDGE,
input  example,input2 example,,,,,,,

몇 가지 참고사항:

  • --ifs-regex " +"필드 구분 기호로 3개 이상의 공백 설정을 사용하십시오 .
  • ragged, 데이터 행에 헤더 행보다 적은 수의 필드가 있는 경우 나머지 키는 빈 문자열로 채워집니다. 데이터 행에 헤더 행보다 더 많은 필드가 있는 경우 암시적 헤더의 경우처럼 정수 필드 레이블을 사용하세요.

마지막 빈 필드를 제거하려는 경우

mlr -N --ifs-regex "   +" --csvlite --ragged remove-empty-columns input.txt

라인 2에서 ,필드 구분 기호가 먼저 오면 동일한 구분 기호를 갖도록 모든 것을 정규화하고 출력을 Miller에 전달해야 합니다.

sed -r 's/,/   /g' input.txt | mlr -N --ifs-regex "   +" --icsvlite --ocsv --ragged remove-empty-columns

출력은 올바른 양의 필드 구분 기호가 있는 올바른 csv입니다.

A_DRIVERLICENSENUMBER_,A_PRIORADDRESS2_,A_MONTHLYRENT_,A_EMPLOYEEID_,A_WORKPHONESPECIALINSTR_,A_REFDETAIL_,A_VERBALPLEDGE
input  example,input2 example,,,,,

답변4

정말로 제목만 수정하려는 경우 첫 번째 줄의 공백과 유사한 문자를 모두 쉼표로 바꿀 수 있습니다.

$ sed '1s/[[:space:]]\{1,\}/,/g' file
A_DRIVERLICENSENUMBER_,A_PRIORADDRESS2_,A_MONTHLYRENT_,A_EMPLOYEEID_,A_WORKPHONESPECIALINSTR_,A_REFDETAIL_,A_VERBALPLEDGE,
input  example,input2 example

원하지 않는 후행 쉼표도 제거하려면 다음을 수행하십시오.

$ sed -e '1s/[[:space:]]\{1,\}/,/g' -e '1s/,$//' file
A_DRIVERLICENSENUMBER_,A_PRIORADDRESS2_,A_MONTHLYRENT_,A_EMPLOYEEID_,A_WORKPHONESPECIALINSTR_,A_REFDETAIL_,A_VERBALPLEDGE
input  example,input2 example

이러한 sed명령은 입력 데이터의 첫 번째 행으로 간주되는 입력 데이터의 헤더 행만 수정합니다. 나머지 데이터는 변경되지 않은 상태로 유지됩니다.


sed마지막 명령을 거의 문자 그대로 번역하면 awk다음과 같습니다.

$ awk 'NR == 1 { gsub(/[[:space:]]+/, ","); sub(/,$/, "") }; 1' file
A_DRIVERLICENSENUMBER_,A_PRIORADDRESS2_,A_MONTHLYRENT_,A_EMPLOYEEID_,A_WORKPHONESPECIALINSTR_,A_REFDETAIL_,A_VERBALPLEDGE
input  example,input2 example

...하지만 다음과 같이 단축할 수 있습니다. awk공백 문자로 첫 번째 줄을 분할하여 쉼표로 구분된 레코드로 다시 형식화합니다.

$ awk -v OFS=, 'NR == 1 { $1=$1 }; 1' file
A_DRIVERLICENSENUMBER_,A_PRIORADDRESS2_,A_MONTHLYRENT_,A_EMPLOYEEID_,A_WORKPHONESPECIALINSTR_,A_REFDETAIL_,A_VERBALPLEDGE
input  example,input2 example

두 경우 모두 첫 번째 행을 제외한 다른 입력 행을 수정하지 않습니다.

관련 정보