큰따옴표로 묶인 쉼표로 구분된 CSV 파일에는 유용한 텍스트 내에 큰따옴표와 쉼표가 있기 때문에 운이 좋지 않았을 수도 있습니다.
그래서 나는 이것을 바꾸고 싶습니다 :
"record 1","name 1","text 1, text 2"
"record 2","name ""2""","text 2"
"record 3","name 3",""
그것에 대해 :
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""
name ""2""
to 에서 큰따옴표를 제거했지만 name 2
라인 #3에서는 큰따옴표를 유지했습니다.,""
답변1
를 사용하여 csvformat
구분 기호를 탭( csvformat -T
)으로 바꾸고 큰따옴표( tr -d '"'
)를 제거한 다음 모든 필드(파이프라인의 마지막 비트)를 인용하면서 구분 기호를 쉼표로 반환합니다.
$ csvformat -T file.csv | tr -d '"' | csvformat -t -U1
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""
csvformat
의 일부입니다csvkit
.
답변2
이것은 입력에 어떤 문자가 있는지에 관계없이 작동합니다(인용 필드 내의 줄 바꿈은 제외하지만 이는 완전히 다른 문제입니다).
FPAT용 GNU awk 사용:
$ awk -v FPAT='("[^"]*")+' -v OFS='","' '{
for ( i=1; i<=NF; i++ ) {
gsub(/"/,"",$i)
}
print "\"" $0 "\""
}' file
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""
또는 awk와 동등한 것:
$ awk -v OFS='","' '{
orig=$0; $0=""; i=0;
while ( match(orig,/("[^"]*")+/) ) {
$(++i) = substr(orig,RSTART,RLENGTH)
gsub(/"/,"",$i)
orig = substr(orig,RSTART+RLENGTH)
}
print "\"" $0 "\""
}' file
"record 1","name 1","text 1, text 2"
"record 2","name 2","text 2"
"record 3","name 3",""