【问题标题】:Sed command in unix is not working on file size greater than 3GBunix 中的 sed 命令不适用于大于 3GB 的文件
【发布时间】:2019-05-24 13:57:00
【问题描述】:

对于大于 3GB 的文件,Sed 命令在 Unix 中不起作用,无法从文件中删除回车符和换行符。

我正在尝试从管道分隔文件中删除换行符。

代码:

sed -i ':a;N;$!ba;s/\n|/|/g'   File.txt

这是一个以竖线分隔的文件,所以我首先搜索行尾,然后用竖线替换换行符。

示例输入:

Test|A|B|C
|D

替换后 - 预期输出:

Test|A|B|C|D

sed 命令对所有小于 3 GB 的文件都可以正常工作,但对于更大的文件则不行。

【问题讨论】:

  • 请在您的问题中添加示例输入和该示例输入所需的输出。
  • 添加了示例输入和所需输出
  • 如果您想使用-i 选项编辑一个 3GB 的文件,您需要在与 3GB 文件相同的目录中有 3GB 的可用空间。如果您将 3GB 的文件加载到内存中(使用命令 N),您还需要 3GB 的可用内存/交换空间。
  • 由于您是新用户,请拨打tour阅读How to Ask。我可以想象你得到了什么错误,但请注意,你只是提供了一种解释(“不起作用”),而不是实际的观察结果,例如错误输出。
  • 请遵守国际公认的单位en.m.wikipedia.org/wiki/International_System_of_Units 标准,具体使用大写G 表示"giga"B 对于 "bytes" en.m.wikipedia.org/wiki/Gigabyte ,因为 b 指的是 "bits" en.m.wikipedia.org/wiki/Gigabit

标签: unix sed


【解决方案1】:

问题是您的 sed 命令首先将整个文件读入内存:

:a        # label a
N         # add next line to pattern space
$!ba      # if not on last line ($!) branch to label a

如果输入足够大,这最终会失败,因为模式空间保存在主内存中。

鉴于您需要的简单替换,在成对的行上进行替换就足够了,例如:

:a        # label a
N         # add next line to pattern space
s/\n|/|/  # substitute new-line pipe by pipe
ta        # if last substitution was successful branch to label a
P         # print first line of pattern space
D         # delete first line of pattern space

作为单行:

sed -n ':a; N; s/\n|/|/; ta; P; D' File.txt

【讨论】:

  • 谢谢。寻求帮助。这似乎适用于 4.4 GB 文件
猜你喜欢
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 2014-03-28
  • 2011-12-16
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多