bash使用来自另一个大型csv文件的值更新巨大的csv文件

时间:2016-04-25 21:41:57

标签: bash csv awk sed

我需要使用来自另一个大csv文件(30K行)的数据更新巨大的csv文件(20M行)的选定行,

要更新的文件是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

修改:

  1. 如果2.csv中的$ 1与1.csv中的$ 1的子字符串匹配(第1行和第2行) 在匹配行2.csv;
  2. 的2美元中按照第3个字符更新1.csv中的$ 2
  3. 匹配字符串的最大大小(第3行和第4行);
  4. 不匹配的行保持不变(第5行到第7行)。
  5. 到目前为止,我设法在while循环中测试sed,但脚本大约需要31天才能完成。我相信还有更好的方法,例如在数组中使用awk文件2.csv并使用该数组更新1.csv,这是我无法做到的,因为我的Awk知识有限

    谢谢

1 个答案:

答案 0 :(得分: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