2017-07-26 26 views
-2

私は2つのテキストファイルを持っていますマルチストリングの検索と置き換え

File1は400K以上の行を持っています。各行は、このサンプルのようになります。

hstor,table,"8bit string",ABCD,0000,0,4,19000101,today 

File2のはFILE1に休息を維持しながら、FILE1に現在のものに代わる新たな8ビットの文字列のリストを持っています。

だからFILE1は、私が400K回

私はスクリプトがこのFILE1内のすべてのOLD 8ビットの文字列が置き換えられることができるようにどのように

をsedはできません

hstor,table,"NEW 8bit string",ABCD,0000,0,4,19000101,today 

hstor,table,"OLD 8bit string",ABCD,0000,0,4,19000101,today 

から行きます新しい8ビット文字列がfile2にリストされていますか?これは、(GNU SED)あなたのために働くかもしれない

+3

あなたはまだ何をしようとしました。ここで

は、コードのですか?あなたの現在の研究努力は何ですか?あなたはどこにいらっしゃいましたか? :)そして将来:適切な句読点の使用を検討してください。それはあなたの質問をもっと読みやすくします。 – Markus

+1

あなたの問題を解決するために 'join'コマンドを使うことができます。 'man join'はあなたの友人です。 – codeforester

+2

「400K回sedできません」 - なぜですか? – klutt

答えて

1

sed 's#.*#s/[^,]*/&/3#' file2 | cat -n | sed -f - file1 

これは、sedスクリプトファイルにFILE2を変換し、FILE1上でそれを実行します。

最初のsedスクリプトはfile2の各行を取り、それを置き換えコマンドに変更します。これは、ターゲットの3番目のフィールドをfile2の現在の行の内容に置き換えます。

これはcatコマンドにパイプされ、sedスクリプトが各置換コマンドに対処するために使用する行番号を挿入します。

最後のsedコマンドは、/ dev/stdinを使用してsedスクリプトを読み込み、入力ファイルfile1に対して実行します。

+0

うまくいくと思われます。しかし、10%をするのに20分かかったので、何かOPが何度もやらなければならないのであれば、それは長くかかりますか分かります。 – klutt

0

これを何回も実行する必要があり、パフォーマンスが重要な場合は、Cでプログラムを作成しました。それはthis codeの修正版です。私はあなたがCタグを使わなかったことを知っていますが、あなたの主な関心事は仕事を終わらせるという印象を受けました。

注:

私はそれについて責任を負いません。それはかなり速いハックの少しです、私はいくつかのものを仮定します。 1つの前提は、置換する文字列にカンマが含まれていないことです。もう1つは、100バイトを超える行はありません。第3の仮定は、入力ファイルの名前がそれぞれfilerepであることです。試してみたい場合は、後でデータを確認してください。 stdoutに書き込むので、出力を新しいファイルにリダイレクトするだけです。それは約2秒で仕事をします。

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

int main() 
{ 

    /* declare a file pointer */ 
    FILE *infile; 
    FILE *replace; 
    char *buffer; 
    char *rep_buffer; 
    long numbytes; 
    long rep_numbytes; 

    /* open an existing file for reading */ 
    infile = fopen("file", "r"); 
    replace = fopen("rep", "r"); 

    /* quit if the file does not exist */ 
    if(infile == NULL) 
    return 1; 
    if(replace == NULL) 
    return 1; 

    /* Get the number of bytes */ 
    fseek(infile, 0L, SEEK_END); 
    numbytes = ftell(infile); 
    fseek(replace, 0L, SEEK_END); 
    rep_numbytes = ftell(replace); 

    /* reset the file position indicator to 
    the beginning of the file */ 
    fseek(infile, 0L, SEEK_SET); 
    fseek(replace, 0L, SEEK_SET); 

    /* grab sufficient memory for the 
    buffer to hold the text */ 
    buffer = (char*)calloc(numbytes, sizeof(char)); 
    rep_buffer = (char*)calloc(rep_numbytes, sizeof(char)); 

    /* memory error */ 
    if(buffer == NULL) 
    return 1; 
    if(rep_buffer == NULL) 
    return 1; 

    /* copy all the text into the buffer */ 
    fread(buffer, sizeof(char), numbytes, infile); 
    fclose(infile); 
    fread(rep_buffer, sizeof(char), rep_numbytes, replace); 
    fclose(replace); 


    char line[100]={0}; 
    char *i=buffer; 
    char *r=rep_buffer; 

    while(i<&buffer[numbytes-1]) { 
    int n; 

    /* Copy from infile until second comma */ 
    for(n=0; i[n]!=','; n++); 
    n++; 
    for(; i[n]!=','; n++); 
    n++; 
    memcpy(line, i, n); 

    /* Copy a line from replacement */ 
    int m; 
    for(m=0; r[m]!='\n'; m++); 

    memcpy(&line[n], r, m); 

    /* Skip corresponding text from infile */ 
    int k; 
    for(k=n; i[k]!=','; k++); 

    /* Copy the rest of the line */ 
    int l; 
    for(l=k; i[l]!='\n'; l++); 
    memcpy(&line[n+m], &i[k], l-k); 

    /* Next line */ 
    i+=l; 
    r+=m+1; 

    /* Print to stdout */ 
    printf("%s", line); 
    }  


    /* free the memory we used for the buffer */ 
    free(buffer); 
    free(rep_buffer); 
}