다음과 같이 쉼표로 구분된 파일이 있습니다.
123,456,"ABC,DEF"
파일을 세미콜론으로 구분된 파일로 변경하고 싶습니다.
123;456;"ABC,DEF"
다음 명령을 실행했지만 불행히도 따옴표 안의 ,도 ;로 변경되었습니다. 이런 일이 발생하지 않도록 하려면 어떻게 해야 합니까?
sed 's/,/;/g; s/\"//g; s/$/;^/' input.csv > output.csv
답변1
따옴표 사이의 쉼표를 변경하지 않고 쉼표로 구분된 것을 세미콜론으로 구분한 것으로 어떻게 변경할 수 있습니까?
당신은 그것을 사용할 수 있습니다 csvtool
. 많은 배포판을 위해 패키지되었습니다. 정규식을 사용하여 csv 형식을 처리하는 것은 어렵고 오류가 발생하기 쉽습니다.
$ csvtool -t ',' -u ';' col 1- input.csv > output.csv
답변2
awk
큰따옴표를 필드 구분 기호로 사용 하고 ,
홀수 ;
필드(1, 3, 5 등)만 바꿀 수 있습니다.
awk 'BEGIN{OFS=FS="\""} {for (i=1;i<=NF;i=i+2) gsub(/,/,";",$i)}1' file
;
여기에는 필드가 처음에 입력되지 않고 큰따옴표 내에 포함/이스케이프가 없는 등 일부 가정이 이루어졌지만 "
입력은 예제에 표시된 것처럼 간단합니다.
보다 복잡한 상황을 처리하기 위해 GNU awk는 다음을 제공합니다.FPAT
해결책csv 파일의 경우 필드의 개행과 같은 경우를 제외하고 대부분의 경우 잘 작동합니다. 이 cvs가 예제처럼 간단할 수 없다면 cvs 구문 분석 라이브러리를 사용하는 프로그램이 필요합니다.
답변3
FPAT에 GNU awk 사용:
$ awk -v FPAT='[^,]*|"[^"]+"' -v OFS=';' '{$1=$1}1' file
123;456;"ABC,DEF"
더 필요하시면 참조하세요https://stackoverflow.com/questions/45420535/whats-the-most-robust-way-to-efficiently-parse-csv-using-awk