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/h3
file2にマップされます。
私の制限は、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