2016-04-25 77 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