sed 또는 perl만 사용하여 잘못된 줄 바꿈으로 잘못된 형식의 CSV를 수정하세요.

sed 또는 perl만 사용하여 잘못된 줄 바꿈으로 잘못된 형식의 CSV를 수정하세요.

쉼표로 구분된 CSV 파일이 있는데 어떤 이유로 인해 시스템이 파일의 임의 위치에 개행 문자를 삽입하여 전체 파일이 손상되었습니다. 파일의 열 수를 얻을 수 있습니다.

한 줄 명령으로 어떻게 사용하거나 해결할 수 있나요 sed? perl나는 그것이 해결될 수 있다는 것을 알고 있지만 awk이것은 학습 목적을 위한 것입니다. 그렇다면 perl내장된 CSV 기능을 사용하고 싶지 않습니다. 해결될 수 있나요? ? 며칠 동안 이 문제를 해결하려고 노력했지만 해결책을 찾을 수 없는 것 같습니다. :(

잘못된 입력 예(무작위 삽입이 많음\n)

policyID,statecode,county,Point longitude,Some Thing Here,point_granularity
119736,FL,CLAY COUNTY,-81.711777,“Residential Lot”,1
448094,FL,CLAY COUNTY,-81.707664,“Residen
tial Lot”,3
206893,FL,CLAY COUNTY,-81.7
00455,“Residen
tial Lot”,1
333743,FL,CLAY COUNTY,-81.707703,“Residential Lot”,
3
172534,FL,CLAY COUNTY,-81.702675,“Residential Lot”,1
785275,FL,CLAY COUNTY,-81.707703,“Residential Lot”,3
995932,FL,CLAY COUNTY,-81.713882,
“Residential Lot”,1
223488,FL,CLAY COUNTY,-81.707146,“Residential Lot”,1
4335
12,FL,CLAY COUNTY,-81.704613,
“Residential Lot”,1

원하는 출력

policyID,statecode,county,Point longitude,Some Thing Here,point_granularity
119736,FL,CLAY COUNTY,-81.711777,“Residential Lot”,1
448094,FL,CLAY COUNTY,-81.707664,“Residential Lot”,3
206893,FL,CLAY COUNTY,-81.700455,“Residential Lot”,1
333743,FL,CLAY COUNTY,-81.707703,“Residential Lot”,3
172534,FL,CLAY COUNTY,-81.702675,“Residential Lot”,1
785275,FL,CLAY COUNTY,-81.707703,“Residential Lot”,3
995932,FL,CLAY COUNTY,-81.713882,“Residential Lot”,1
223488,FL,CLAY COUNTY,-81.707146,“Residential Lot”,1
433512,FL,CLAY COUNTY,-81.704613,“Residential Lot”,1

답변1

$ awk -F, '{ while (NF < 6 || $NF == "") { brokenline=$0; getline; $0 = brokenline $0}; print }' file.csv
policyID,statecode,county,Point longitude,Some Thing Here,point_granularity
119736,FL,CLAY COUNTY,-81.711777,“Residential Lot”,1
448094,FL,CLAY COUNTY,-81.707664,“Residential Lot”,3
206893,FL,CLAY COUNTY,-81.700455,“Residential Lot”,1
333743,FL,CLAY COUNTY,-81.707703,“Residential Lot”,3
172534,FL,CLAY COUNTY,-81.702675,“Residential Lot”,1
785275,FL,CLAY COUNTY,-81.707703,“Residential Lot”,3
995932,FL,CLAY COUNTY,-81.713882,“Residential Lot”,1
223488,FL,CLAY COUNTY,-81.707146,“Residential Lot”,1
433512,FL,CLAY COUNTY,-81.704613,“Residential Lot”,1

awk현재 행에 필드가 6개 미만이거나 마지막 필드가 비어 있을 때마다(마지막 필드 구분 기호 다음에 행이 끊어짐) 코드는 다음 입력 줄을 현재 행에 추가합니다.


Perl의 작동 방식과 유사합니다.

perl -ne 'chomp;while (tr/,/,/ < 5 || /,$/) { $_ .= readline; chomp } print "$_\n"' file.csv

답변2

Kusalananda가 말했듯이 각 줄에는 6개의 필드가 있으므로 gnu sed로 시도해 볼 수 있습니다.

sed -E ':A;h;s/^/,/;s/((,[^,]+){6})(.*)/\3/;/./{g;N;s/\n//;bA};g' infile

관련 정보