2017-02-11 14 views
2

파일 형식이 양호하고 헤더 행이 있거나 없을 수 있습니다. 따옴표 붙은 데이터가 있거나 없을 수 있습니다. 셸을 사용하여 열의 수를 결정하려고합니다.쉘에서 CSV의 필드 수를 어떻게 확인할 수 있습니까?

x=$(tail -1 00-45-19-tester-trace.csv | grep -o , | wc -l); echo $((x + 1)) 

하지만 만약 내가 그 가정을 만들 수 없습니다 무엇을 : 나는 파일에는 인용 쉼표가 없는지 확인 될 수 있다면, 다음과 같은 지금

가 작동하는 것 같다? 즉, 쉼표가 항상 필드 구분자라고 가정 할 수 없으면 어떻게해야합니까? 그러면 어떻게해야합니까?

도움이된다면 따옴표가없는 따옴표가 없다는 가정을 할 수 있습니다 (예 : 따옴표로 묶은 문자열 사이에 \"). 하지만 그 중 하나를 만들지 않는 것이 좋습니다.

답변

7

데이터에 대한 낙관적 인 가정을 할 수 없다면 Bash에 간단한 해결책이 없을 것입니다. 삽입 가능한 개행 문자 및 포함 된 구분 기호로 일반 CSV 형식을 파싱하는 것은 쉽지 않습니다. bash에서 쓰지 않는 것이 좋지만 기존의 적절한 CSV 구문을 사용하는 것이 좋습니다. 예를 들어 파이썬에는 표준 라이브러리가 내장되어 있습니다.

거기는 AWK 사용하여 쉼표로 분할 간단보다 더 임베디드 줄 바꿈없이 임베디드 구분이 없다고 가정 할 경우

awk -F, '{ print NF; exit }' input.csv 

-F, 필드 구분 기호로 쉼표를 사용하는 AWK를 알려줍니다, 그리고 자동 NF 변수는 현재 행의 필드 수입니다.

이 포함 된 분리를 허용 할 수 있지만 이전과 같은 AWK에 배관하기 전에, 당신은, 간단한 필터를 포함 구분을 제거 할 수있는 임베디드 따옴표를 가정 할 수없는 경우

head -n 1 input.csv | sed -e 's/"[^"]*"//g' | awk ... 

주 이 두 예제 모두 첫 번째 줄을 사용하여 필드 수를 결정합니다. 입력이 헤더 행이있는 경우 헤더 줄 바꿈

첫 번째 행
+0

Awk는이 작업을위한 가장 우아한 도구입니다. ... –

1

카운트 필드를 포함 포함하지 않아야으로,이 모든 행이 에게

대처하지 않습니다 같은 수의

CNT=$(head -n1 hhdata.csv | awk -F ',' '{print NF}') 

cat hhdata.csv | awk -F ',' '{print NF}' | grep -v $CNT 
을 확인, 아주 잘 작동합니다 포함 된 쉼표로 표시되지만 존재하는 경우 강조 표시됩니다.

+0

"첫 번째 필드", "두 번째 필드, 이름, with, 쉼표, in, it", " 세 번째 필드 ". – einpoklum