2011-11-07 3 views
3

이 스크립트는 1.7GB 텍스트 파일에서 실행됩니다.쉘 스크립트 : grep + while 큰 파일에서 + cut + awk = 매우 느림

#!/bin/bash 

File1=$1.tmp 
File2=$1.modified 

grep '^#' $1 > $File2 
grep -v '#' $1 > $File1 

while read line; do 
     column_four=$(echo $line | cut -d " " -f4) 
     final_line=$(echo $line | cut -d " " -f4-5) 
     if [ "$column_four" == "0" ]; then 
       beginning_line=$(echo $line | cut -d " " -f1-3) 
       final_line=$(echo $line | cut -d " " -f4-5) 
     else 
       final_line=$(echo $line | cut -d " " -f1-2) 
     fi 
     linef=$(echo "$beginning_line $final_line") 
     echo $linef | awk '{printf "%5.0f%12.4f%12.4f%5.0f%12.4f\n", $1, $2, $3, $4, $5}' >> $File2 
done < $File1 
rm -f $File1 

문제는 매우 느립니다. Core2Duo를 사용하여 분당 200KB의 속도로 정렬 된 열을 가진 새로운 파일을 생성합니다. 어떻게하면 더 빨리 만들 수 있습니까?

감사합니다.

+0

같은 당신의 입력 파일 및 예상/원하는 출력의 예를의 샘플을 게시하시기 바랍니다 수 있습니다. –

답변

3

내가 루프 페지하고 AWK의 단일 호출을 사용합니다 :

awk ' 
{ 
    if ($4 == 0) { 
     f1 = $1; 
     f2 = $2; 
     f3 = $3; 
     f4 = $4; 
     f5 = $5; 
    } else { 
     f4 = $1; 
     f5 = $2; 
    } 
    printf ("%5.0f%12.4f%12.4f%5.0f%12.4f\n", f1, f2, f3, f4, f5); 
}' < $File1 >> $File2 

당신이 awk, echo하고 입력 파일의 줄에 cut 여러 번 호출하지 않는 바로 실행하는 방법을 단일 awk 프로세스.

+0

'#'으로 시작하는 행을 걸러 내기를 잊어 버렸지 만, 그것은 사소한 추가 일 것입니다. –

+0

@JanHudec : 그 라인은 while 루프를 대신하는 의미 였지만 내 대답은 분명하지 않았습니다. – beny23

+0

하지만 grep도 대체 할 수 있습니다. '{}'블록 앞에는 정규식이있을 수 있습니다. –

3

당신은 awk에있는 모든 것은, 지금까지 내가 보는대로,

awk '/^#/ { print $0 >> "File2" ; getline} 
    $0 ! ~ /#/ { if ($4 == 0) { 
        f1 = $1 ; f2 = $2 ; f3 = $3 
        printf("%5.0f%12.4f%12.4f%5.0f%12.4f\n", f1, f2, f3, $4, $5) >> "File2" } 
        else { printf("%5.0f%12.4f%12.4f%5.0f%12.4f\n", f1, f2, f3, $1, $2) >> "File2" } 
         } INPUTFILE 
+1

쉘 코드가 4 번째 열이 "0"이고 다른 경우 값을 재사용하는 경우에만 쉘 코드가'$ begin_line' 변수를 재설정하기 때문에 기능적으로 동일하지 않다고 생각하지 마십시오. – beny23

+0

@ beny23 네 말이 맞아, 나는 그것을 놓쳤다. 답변 업데이트 (귀하의 답변과 거의 동일합니다). –