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 구문 분석 모듈과 함께 고급 스크립트 언어를 사용하는 것이 가장 좋습니다.