別のファイルに存在するフィールドを置き換えながら、大容量ファイルで検索して置き換える最速の方法

別のファイルに存在するフィールドを置き換えながら、大容量ファイルで検索して置き換える最速の方法

2つのファイルがあります。 File1は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,.....

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

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

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

今やりたいことは、file1のフィールド2をフィールド2と一致するfile2行のフィールド1に置き換えることです。例:

ファイル1から:

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

する

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

そのうちOPUM04181⇔はCheck1|^/h1/h2/h3file2にマップされます。

私の制限は、File1とfile2の値のセットが同じではないことです。また、両方のファイルには300万行があります。

これが私が試していることです:

  • file1からフィールド2を取得するためにループを実行しました。
  • file2にフィールドがあることを確認しています。
  • 存在する場合は、file2のフィールド1を使用します。
  • file1で置換field2を使用しています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番目のフィールドを置き換えます。各ファイルは一度だけ処理されます。

出力は標準出力に移動するため、ファイルを「所定の位置」に置き換えるには、次のようにします。

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

おすすめ記事