
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.....
ここで、OPUM04181
↔Check1|^/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