2017-11-04 1 views
0

약 150 열을 포함하고 매우 큰 파일 인 CDR 파일 (.CSV)이 있습니다. 31 번째 열이 값 "13"을 가져야하는 출력을 얻으려고합니다..CSV 파일에서 awk 명령을 사용하여 검색하는 방법

awk -F',' '$31~/^13/' report_1.csv > report_2.csv 

을하지만, 다음과 같은 오류지고 :

나는 아래의 명령으로 노력하고

awk: record `,1402786,535,1,47432... has too many fields record number 1` 

어떤 도움을?

+0

어떤 버전의'awk'를 사용하고 있습니까? – hek2mgl

답변

1

내가 제안 : awk

awk -F',' '$31 == "13"' report_1.csv > report_2.csv 
0

구현에 컬럼의 최대 수와 함께. 예 : mawk. 당신은 다음과 같이 NF에 할당하여 쉽게 테스트 할 수 있습니다 :

$ mawk 'BEGIN{NF=32768}' 
mawk: program limit exceeded: maximum number of fields size=32767 
     FILENAME="" FNR=0 NR=0 

이 산책, 당신은 명시 적으로 제한이없는 GNU AWK, gawk를 사용할 수 있습니다.

$ gawk 'BEGIN{NF=32768}' 
$ gawk 'BEGIN{NF=1000000}' 

글쎄, 여전히 사용 가능한 메모리 양에 의해 제한됩니다. (그러나 그것은 당신이 정상적인 PC에 적어도 수백만 개의 필드를 가질 수 있어야합니다).

추신 : gawk을 설치해야하며 대용량 파일 처리가 느릴 수도 있습니다.

1

필드 수 제한이 150보다 작아서는 안됩니다. 은 CSV 파일을 올바르게 구문 분석하지 않는 것 같습니다..

특히 쉼표로만 구분해서는 안되며 따옴표가있는 입력란 ("like,this") 내에서 ,으로 나누지 않아야합니다.

awk -v FPAT='[^,]*|"[^"]+"' '$31 == "13"' file 
: 정확히 일치하는,

awk -v FPAT='[^,]*|"[^"]+"' '$31 ~ /^13/' file 

나 :

당신이 GNU awk를 사용하는 경우는, 적절한 CSV 구문 분석 (@Ed 모튼 this excellent answer에 따라) FPAT를 통해 매우 간단하다

GNU가 아닌 awk의 경우 대체 구문 분석 방법에 대한 인용 답변을 참조하십시오.

+0

고마워 .... 나는 31 번째 칼럼이 "13", 56 번째 칼럼이 "ABC"이고 80 번째 칼럼이 awk 명령어 여야한다는 것을 출력 할 것인지 물어볼 필요가있다. – User123

+1

'$ 31 == "13"&& $ 56 == "ABC"&& $ 80 ~ /.../'조건을 결합하십시오. – randomir

+0

@ User123, 나는 당신이 이미 [새로운 질문] (https://stackoverflow.com/questions/47113325/trying-to-get-the-results-using-awk)에서 이것을 묻습니다. comment :) 여하튼,이 답변이 도움이됩니까? 그리고/또는 당신이 가진 초기 문제를 해결합니까? – randomir

관련 문제