【问题标题】:Replace string in a 20 gb csv file替换 20 gb csv 文件中的字符串
【发布时间】:2015-04-06 11:11:01
【问题描述】:

我有一个大的 csv 文件 (20 GB)。在文件中,我想用<br/> 替换所有出现的\r。我正在使用以下命令来实现这一点:

sed -i 's/\r/<br\/>/g' data.csv

 perl -i.bak -pe 's/\r/<br\/>/g' data.csv

问题是这两个命令都失败了(结果文件为空)。有没有更好的方法来做到这一点?

【问题讨论】:

  • 您的文件是否使用 Linux 行尾 ('\r') 或其他?您是否尝试过编写\n 而不是\r(C 标准说行尾会自动转换为\n,所以这可能会影响这些程序(我知道它会影响vim))?此外,“失败”和“结果文件为空”是非常不同的。
  • 实际上该文件同时具有 \n 和 \r 。在一个较小的文件上,我首先将所有 \n 替换为
    ,但仍然发现了一些换行符。然后我替换了 \r 并且它起作用了。我无法对大文件执行类似的操作。是的,命令没有失败。结果是一个空文件
  • 好的,那么该文件是来自 os x 还是 windows 之类的?您总是可以尝试 dos2unix 和类似的命令来修复行尾。尽管如此,未转义的反斜杠可能是一个问题,如下面的答案中所述。

标签: linux csv scripting


【解决方案1】:

只需用这个替换你的sed 命令,我只是在源字符串中添加了一个\,它将使\ 成为普通字符。

sed -i 's/\\r/<br\/>/g' data.csv

还有另一种方法可以做到这一点,

tr '\r' '_' data.csv
sed -i 's/_/<br\/>/g' data.csv

【讨论】:

  • 但我希望 \r 被视为回车。相同的命令适用于较小的文件。我不确定,这将如何改变输出?
  • 我尝试了自己的文件,所以在这里回答了这个问题,@user2730428 你试过我的回答了吗??
  • 您确定@user2730428 您的文件包含需要替换的\r
  • 那么替换文件中不知道的字符是没有用的。
  • 但是应该不会影响输出吧?即使字符不存在,我也应该得到与输出相同的文件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2022-06-16
  • 2018-09-11
  • 2013-01-07
  • 2023-03-21
相关资源
最近更新 更多