在大文件中尋找和取代同時取代另一個文件中存在的欄位的最快方法

在大文件中尋找和取代同時取代另一個文件中存在的欄位的最快方法

我有兩個文件。 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 替換為 file2 中與欄位 2 相符的行的欄位 1。

在文件1中:

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

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

其中OPUM04181Check1|^/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 的第二個欄位。每個文件只處理一次。

輸出轉到標準輸出,因此要“就地”替換文件,請執行以下操作

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

相關內容