Автор Тема: Замена для sed при замене строк  (Прочитано 3618 раз)

Оффлайн keremet

  • Global Moderator
  • ROOT
  • *****
  • Сообщений: 461
  • Репутация: +237/-0
    • Просмотр профиля
    • OpenSolaris
Замена для sed при замене строк
« : Сентябрь 23, 2011, 06:46:13 am »
Один раз мне потребовалось выполнить над файлом размером 74МБ команду
sed 's/),(/);\ninsert into kladr(name,socr,code,idx,gninmb,uno,ocatd,status)values(/g'

Команда выполнялась несколько часов и сильно грузила проц. В качестве решения была написана собственная программа замены строк

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int usage(char* name){
   fprintf(stderr,"Usage: %s findStr replTo\n", name);
   return 1;
}

int main(int argc, char**argv){
   if(argc!=1+2){
   return usage(argv[0]);
   }
   const char* findStr=argv[1];
   int findStrLen=strlen(findStr);
   const char* replTo=argv[2];
   char *buf=malloc(findStrLen);
   int buflen=0;
   int c;
   while((c=getc(stdin))!=EOF){
      if(c==findStr[0]){
         buf[buflen++]=c;
         for(int i=1;i<findStrLen;i++){
            if((c=getc(stdin))!=EOF){
               buf[buflen++]=c;
               if(c==findStr[ i ])
                  continue;
            }
            for(int j=0;j<buflen;j++)
               putc(buf[j],stdout);
            goto lNextWhile;
         }         
         fputs(replTo,stdout);
         buflen=0;
      }else
         putc(c,stdout);
   lNextWhile:
      ;
   }
   free(buf);
   return 0;
}

$ cat makefile
APP=sosed
all:$(APP)
$(APP): sosed.c
   gcc -O3 -std=c99 -o$@ sosed.c



Эта команда выполняется над теми же данными за несколько секунд
sosed "),(" ");
> insert into kladr(name,socr,code,idx,gninmb,uno,ocatd,status)values(" < test > test2

Дальнейшее развитие - многопоточность