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
두 경우 모두 첫 번째 행을 제외한 다른 입력 행을 수정하지 않습니다.