큰따옴표 필드 내에서 개행으로 구분된 줄을 병합하는 방법은 무엇입니까?

큰따옴표 필드 내에서 개행으로 구분된 줄을 병합하는 방법은 무엇입니까?

입력이 다음과 같다고 상상해 보세요:

KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,"1GH8
",KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code

3줄을 원합니다(예: 줄 바꿈은 ####입니다).

KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,"1GH8####",KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code

고마워요, 엠마누엘

답변1

awk해결책:

awk -F',' '{ printf "%s%s", $0, ($NF ~ /^".+[^"]$/? "####" : ORS) }' file

산출:

KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,"1GH8####",KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code

답변2

sed -r ':x /$/ { N; s/\r?\n\s*"/####"/; bx}' inputfile

\r?Linux 및 Windows 텍스트 파일에서 작동하도록 설정

답변3

데이터는 적절하게 인용되어 있으며 CSV를 지원하는 모든 파서에서 읽을 수 있어야 합니다.

헤더 없는 CSV 파일의 5번째 필드에서 가능한 줄 바꿈을 제거하려면 다음을 사용할 수 있습니다.밀러( mlr) 이와 같이:

$ mlr --csv -N put '$5 = sub($5,"\n","")' file
KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,1GH8,KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code

이렇게 하면 첫 번째 개행 문자를 로 대체하여 다섯 번째 필드를 다시 작성합니다 sub()(즉, 제거합니다) .

####개행 문자를 다음으로 바꿀 수도 있습니다.

$ mlr --csv -N put '$5 = sub($5,"\n","####")' file
KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,1GH8####,KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code

결과 필드에는 따옴표가 필요하지 않으므로 Miller는 기본적으로 따옴표를 추가하지 않습니다. 원래 인용문을 유지하려면 다음을 사용하십시오 --quote-original.

$ mlr --csv -N --quote-original put '$5 = sub($5,"\n","####")' file
KY,On,Ind ,Yes,1J5Z,KYEEI9,1/1/2016 Contract Code
KY,On,Ind ,Yes,"1GH8####",KYEEID,1/1/2016 Contract Code
KY,On,Ind ,Yes,1J5Y,KYEEIJ,1/1/2016 Contract Code

-I"내부" 편집을 수행하는 데 사용됩니다 .

관련 정보