2016-04-25 79 views
0

我需要更新龐大的CSV文件(20M行)與另一大csv文件(30K行)數據的選擇行的值,慶典更新龐大的CSV文件,從另一家大型csv文件

文件進行更新是1.csv 1120120031,55121 1120127295,55115 6135062894,55121 6135063011,55215 4136723818,55215 6134857289,55215 4430258714,55121

更新文件是2.csv 112012 ,55615 6135062,55414 6135063,55514 995707 ,55721

如1_MOD.csv 1120120031,55621 1120127295,55615 6135062894,55421 6135063011,55515 4136723818,55215 6134857289,55215 4430258714,55121

國防部ifications:

  1. 如果$ 1 2.csv匹配1.csv $ 1子串(行1 & 2)然後 更新$ 2 1.csv按照在匹配的行2.csv的2 $第三字符;
  2. 匹配字符串的最大大小(行3 & 4);
  3. 不匹配的行保持不變(第5到7行)。

到目前爲止,我設法在while循環中測試sed,但腳本需要大約31天才能完成。我相信這是一個更好的辦法,如在陣列和更新1.csv與陣列AWK文件2.csv,這東西是我在awk的知識僅限

感謝

+1

當你有這麼大的文件時,最好使用perl代替,它可能會快得多。 –

回答

1

使用awk我不能這樣做,在2.csv中讀取,並使用第一個字段作爲模式。

BEGIN { 
    FS = " *, *"; 
    OFS = ","; 
} 
NR==FNR { 
    # Ensure there are no special characters in $1 
    if ($1 ~ /^[[:digit:]]+$/) 
     a[$1] = substr($2, 3, 1); 
    next; 
} { 
    for (n in a) 
     if ($1 ~ "^"n) { 
      $2 = substr($2, 1, 2) a[n] substr($2, 4, length($2) - 3); 
      break; 
     } 
} 1 
+2

發現匹配後,您可能會破壞'for'循環,這應該會節省一些處理時間。 –

+0

@JonathanLeffler謝謝,我添加了「break」。 – kdhp

+0

@kdhp和jonathanLeffler,非常感謝,在一小時內你解決了我在幾天內無法解決的問題。我將運行幾千行的腳本來查看需要多長時間 – Hayden