
我有兩個文件。 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.....
其中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 的第二個欄位。每個文件只處理一次。
輸出轉到標準輸出,因此要“就地”替換文件,請執行以下操作
awk ... file2 file1 > tempfile && mv tempfile file1