필드에 쉼표가 포함된 경우 "cut" 명령을 사용하여 CSV 파일의 필드를 자르려면 어떻게 해야 합니까?

필드에 쉼표가 포함된 경우 "cut" 명령을 사용하여 CSV 파일의 필드를 자르려면 어떻게 해야 합니까?

CSV 파일 형식 데이터는 다음과 같습니다.

"Pizza,wings,icecream","hopper","0",,"Masdfasdf","USA","381","10 AM","cap",,,"monster"

아래 표시된 대로 쉼표를 구분 기호로 사용하면 쉼표가 있는 필드가 구분 기호로 계산되는데 이는 내가 원하는 것이 아닙니다.

cat /path/to/file | cut -d , -f2

돌아올 것이다

wings

내가 원할 때

hopper

논리적인 해결책을 찾은 것 같은데 어떻게 구현해야 할지 모르겠습니다.

"다른 쉼표나 따옴표로 둘러싸인 쉼표라면 나를 구분자로 간주합니다"라는 구분자를 어떻게 만드나요?


[tksmith@rifle ~]$ cat deleteme 

"Pizza,wings,icecream","hopper","0",,"Masdfasdf","USA","381","10 AM","cap",,,"monster"

[tksmith@rifle ~]$ cat deleteme | cut -d , -f2

wings

답변1

CSV 형식에는 재분석을 원하지 않을 정도로 극단적인 경우가 많습니다. 올바른 CSV 파서를 사용하세요. 예를 들어 루비를 사용하면

ruby -rcsv -e 'CSV.foreach(ARGV.shift) {|row| puts row[1]}' file

답변2

cut 명령은 한 번에 한 문자만 구분합니다. 따라서 sed 및 정규식을 사용하여 따옴표와 쉼표를 다른 단일 문자 구분 기호로 변환할 수 있습니다. 예를 들어:

sed -e 's/","\|",\|,"\|,,/@/g' /path/to/file | cut -d@ -f2

돌아올 것이다

hopper

또 다른 방법은 AWK를 사용하는 것입니다. 예를 들어, 다음은 두 번째 필드를 제공합니다.

awk -F ',,|^"|","|",|,"|"$' '{print $3}' /path/to/file

돌아올 것이다

hopper

위의 예는 여러 개의 빈 필드와 외부 따옴표가 있는 모든 사례를 올바르게 처리하지 못하므로 완벽하지 않습니다. CSV 구문 분석 모듈과 함께 고급 스크립트 언어를 사용하는 것이 가장 좋습니다.

관련 정보