따옴표 안에 쉼표를 넣어 csv 파일을 파이프(|)로 구분된 파일로 변환하려면 쉘 스크립트가 필요합니다.

따옴표 안에 쉼표를 넣어 csv 파일을 파이프(|)로 구분된 파일로 변환하려면 쉘 스크립트가 필요합니다.

샘플 파일(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!##!

관련 정보