別のファイルに存在するフィールドを置き換えながら、大きなファイル内で検索と置換を行う最も速い方法

別のファイルに存在するフィールドを置き換えながら、大きなファイル内で検索と置換を行う最も速い方法

2 つのファイルがあります。ファイル 1 は 60 個のフィールドを持つ csv です。

111,Check1|^/h1/h2/h3,22062014184500,20,0.....
111,Check2|^/h43/h40/h9,22062014184500,4,.....
111,Check3|^/h1/h3/h4,22062014184500,0,0,.....

ファイル2はマッピングファイルです。

OPUM04181,Check1|^/h1/h2/h3
OPUM04040235,Check3|^/h1/h3/h4
OPUM04051898,Check2|^/h43/h40/h9 

ここで、ファイル 1 のフィールド 2 のフィールドを、一致するフィールド 2 のファイル 1 のフィールド 1 に置き換える必要があります。例:

ここで、ファイル 1 のフィールド 2 を、フィールド 2 に一致するファイル 2 の行のフィールド 1 に置き換える必要があります。例:

ファイル1の場合:

111,Check1|^/h1/h2/h3,22062014184500,20,0.....

だろう

111,OPUM04181,22062014184500,20,0..... 

ここで、OPUM04181Check1|^/h1/h2/h3はファイル2 にマッピングされます。

私の制約は、File1 と file2 の値のセットが同じではなく、その数が異なっていることです。また、両方のファイルの行数は 300 万です。

私が試していたのはこれです:

  • ファイル1のフィールド2を取得するループを実行しました
  • そのフィールドがファイル2に存在するかどうかを確認していました。
  • 存在する場合は、ファイル2 のフィールド 1 を取得しました。
  • 私は、 を使用してファイル 1 のフィールド 2 を置き換えていましたsed s///g。しかし、これには膨大な時間がかかります。

また、File1 をソートできません。

もっと速い方法は何ですか?

答え1

awk -F, -v OFS=, '
    NR==FNR {opu[$2]=$1; next} 
    $2 in opu {$2 = opu[$2]; print}
' file2 file1

これは、「マッピング」ファイルをメモリに読み込み、file1 の 2 番目のフィールドを置き換えます。各ファイルは 1 回だけ処理されます。

出力はstdoutに送られるので、ファイルを「その場で」置き換えるには次のようにします。

awk ... file2 file1 > tempfile && mv tempfile file1

関連情報