【问题标题】:To Remove Comma at the end of each line in a very huge File (5GB) in Unix在 Unix 中非常大的文件 (5GB) 中删除每行末尾的逗号
【发布时间】:2019-12-30 09:57:39
【问题描述】:

输入

"India","Australia",1991-07-03,99,
1991-07-03,99,"India","Australia",

以上只是文件中的示例行。 1 行的长度是 1800(大约)。文件大小为 5 GB。每行以 (Carraige Feed 换行)字符结尾。我需要从中删除 , 。

输出

"India","Australia",1991-07-03,99
1991-07-03,99,"India","Australia"

我使用的命令

cat InputFile | sed 's~,\r~\r~g' > OutputFile.

问题

命令运行良好,但完成更改需要 15 分钟。

问题

还有其他快速/更好的方法可以快速完成这项工作吗?

【问题讨论】:

  • 注意这里使用cat没有意义,使用sed 's~,\r~\r~g' InputFile > OutputFile
  • 你真的必须删除尾随 , 还是你可以例如用空格替换它?
  • 试试:sed 's/,\r$//' file > output
  • 那么就没有办法重写 5 GB 的数据了。
  • 顺便说一句,保留 DOS 行结尾似乎是错误的。

标签: bash unix sed sh ksh


【解决方案1】:

如果你想让这个速度更快,你可以尝试使用 split。 https://kb.iu.edu/d/afar

将文件拆分为多个较小的文件,然后对生成的较小文件执行线程循环,并将每个较小文件的 sed 输出到新的结果文件中。

【讨论】:

    【解决方案2】:

    如果您想显着提高速度,恐怕您需要使用编译代码解决方案。 Perl,Java,c。这是我已经测试并适用于您的案例的 c 代码:

    #include <stdio.h>
    
    int main(){
        int c, d;
        c = getchar();
        if (c == EOF) return 0; // edge case, empty file
        for (d = getchar(); d != EOF; c = d, d = getchar())
                if (c != ',' || d != '\r') putchar(c);
        putchar(c); // last char in file
    }
    

    我想我应该添加如何基本运行该代码。当然,你需要一个 c 编译器,cc。假设是这样,把上面的代码放到一个comma.c文件中,那么:

    $ cc comma.c
    $ ./a <InputFile >OutputFile
    

    【讨论】:

      【解决方案3】:

      删除每行末尾的逗号的简单解决方案是使用 sed 命令:

      sed -i 's/,$//' input-file
      

      如果您不想修改原始文件,您可以创建一个新的输出文件,如下所示:

      sed 's/,$//' input-file > output-file
      

      【讨论】:

        猜你喜欢
        • 2017-06-29
        • 2011-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-09
        • 2012-10-18
        • 1970-01-01
        相关资源
        最近更新 更多