2013-08-11 2 views
1

저는 awk에 상당히 익숙하며 파일 처리 내용을 읽고 그 결과에 따라 몇 개의 파일에 결과를 추가하는 스크립트를 작성하고 있습니다. 이 스크립트는 약 100 줄을 포함하는 파일에서 작동하지만 125k 줄이 포함 된 파일에서는 실패합니다. 나는 awk가 더 큰 파일로 잘 동작하는 것을 보았 기 때문에 나는 여기에있는 일을하는 방식에 문제가 있다면 혼란 스럽다.awk가 대용량 파일의 내용을 읽지 못했습니다.

여기 내 코드입니다 : FileSplitting.awk

BEGIN { print "Splitting file ";} { print NR; r=int($2/1024); if(r>5){ print $0 >> "testFile";} if(r<=5){ print $0 >> "testFile2";} } END { print "Done"; } 

이 같은 스크립트를 호출하고 있습니다 :

awk -F"," -f FileSplitting.awk test.csv 

답변

2

문제는 잘못된 출력 리디렉션 연산자를 사용하고 있습니다. >이 아닌 >>을 사용해야합니다. awk는이 두 연산자의 쉘과 동일하게 동작하지 않습니다. 당신은 파일을 닫을 필요가 없습니다

BEGIN { print "Splitting file " } 
{ print NR; print > ("testFile" (int($2/1024)>5?"":"2")) } 
END { print "Done" } 

: 그것은 일하러 가야

BEGIN { print "Splitting file ";} { print NR; r=int($2/1024); if(r>5){ print $0 > "testFile";} if(r<=5){ print $0 > "testFile2";} } END { print "Done"; } 

, 다음에 정리 : 그 운영자는 AWK에서 일하고에 스크립트를 변경하는 방법에 대한 남자 AWK 매 쓰기 후에. @에 대응

은 다음과 아리아의 코멘트는 여기에 해당하는 쉘 동의어를 대 >>> AWK 있습니다

1) >

awk: 
    { print > "foo" } 

shell equivalent: 

    > foo 
    while IFS= read -r var 
    do 
     printf "%s\n" "$var" >> foo 
    done 

2) >>

awk: 
    { print >> "foo" } 

shell equivalent: 

    while IFS= read -r var 
    do 
     printf "%s\n" "$var" >> foo 
    done 
+0

아차 AWKS AWKS! '>'와'>>'도 같은 방식으로 작동한다고 가정합니다. 알려 주셔서 감사합니다. 당신은 내가 그들의 차이점에 대해 배울 수있는 참고 문헌을 가르쳐 주시겠습니까? – Aryan

+0

''awk에서 그 연산자가 어떻게 작동하는지''awk "'삼항 연산자는'GNU awk' 만 +1합니다. –

+0

3 진 연산자는 1980 년대 후반부터 awk 언어의 일부였습니다. 그것은 gawk-only가 아니며 모든 현대 awks에서 지원되어야합니다. –

관련 문제