샘플 파일(test.csv):
"PRCD-15234","CDOC","12","JUN-20-2016 17:00:00","title, with commas, ","Y!##!"
"PRCD-99999","CDOC","1","Sep-26-2016 17:00:00","title without comma","Y!##!"
결과물 파일:
PRCD-15234|CDOC|12|JUN-20-2016 17:00:00|title, with commas, |Y!##!
PRCD-99999|CDOC|1|Sep-26-2016 17:00:00|title without comma|Y!##!
작동하지 않는 내 스크립트는 다음과 같습니다.
while IFS="," read f1 f2 f3 f4 f5 f6;
do
echo $f1|$f2|$f3|$f4|$f5|$f6;
done < test.csv
답변1
(generate output) | sed -e 's/","/|/g' -e 's/^"//' -e 's/"$//'
또는
sed -e 's/","/|/g' -e 's/^"//' -e 's/"$//' $file
3가지 표현의 경우:
-e 's/","/|/g'
= 모든 구분 기호를","
새 구분 기호로 교체|
-e 's/^"//'
= 선행"
태그 제거-e 's/"$//'
= 줄 끝 표시"
제거
이렇게 하면 초기 구분 기호 패턴과 일치하지 않는 한 헤더에 나타나는 따옴표가 유지됩니다.","
답변2
어때요?
cat test.csv | sed 's/\",\"/|/g' | sed 's/\"//g'
파일의 데이터가 위에 표시된 방식이라고 가정하면(나는 특별한 경우를 고려하지 않습니다.) 그러나 위의 내용은 나에게 효과적입니다.
답변3
이것은 포함된 문자열 구분 기호를 처리합니다.
$ cat /tmp/bla
"PRCD-15234","CDOC","12","JUN-20-2016 17:00:00","title, with commas, ","Y!##!"
"PRCD-99999","CDOC","1","Sep-26-2016 17:00:00","title without comma","Y!##!"
"PRCD-99999","CDOC","1","Sep-26-2016 17:00:00","embedded\",delimiters\",","Y!##!"
sed -E 's/"(([^"]*(\\")?)*)",/\1|/g;s/"|(([^"]*(\\")?)*)"/\1/g'
→
PRCD-15234|CDOC|12|JUN-20-2016 17:00:00|title, with commas, |Y!##!
PRCD-99999|CDOC|1|Sep-26-2016 17:00:00|title without comma|Y!##!
PRCD-99999|CDOC|1|Sep-26-2016 17:00:00|embedded\",delimiters\",|Y!##!
답변4
귀하의 스크립트는 CSV 파서처럼 인용된 필드를 구문 분석하지 않기 때문에 작동하지 않습니다. 즉, 필드를 구분 기호로 참조하는 쉼표를 처리합니다.
두 개의 CSV 인식 도구를 사용합니다 csvformat
(csvkit) 그리고밀러( mlr
):
$ csvformat -D '|' file
PRCD-15234|CDOC|12|JUN-20-2016 17:00:00|title, with commas, |Y!##!
PRCD-99999|CDOC|1|Sep-26-2016 17:00:00|title without comma|Y!##!
$ mlr --csv --ofs pipe cat file
PRCD-15234|CDOC|12|JUN-20-2016 17:00:00|title, with commas, |Y!##!
PRCD-99999|CDOC|1|Sep-26-2016 17:00:00|title without comma|Y!##!