bash - 在大型 (30G) 单行文件上运行 sed 返回空输出

标签 bash ubuntu sed command-line

我正在尝试使用 sed 对大型 (30G) 一行 文件执行简单的文字搜索/替换。

我预计这会花费一些时间,但是当我运行它时,它会在几秒钟后返回,当我查看生成的文件时,它的长度为零。

  • 输入文件有30G

    $ ls -lha Full-Text-Tokenized-Single-Line.txt  
    -rw-rw-r-- 1 ubuntu ubuntu 30G Jun  9 19:51 Full-Text-Tokenized-Single-Line.txt
    
  • 运行命令:

    $ sed 's/<unk>/ /g' Full-Text-Tokenized-Single-Line.txt > Full-Text-Tokenized-Single-Line-No-unks.txt
    
  • 输出文件的长度为零!

    $ ls -lha Full-Text-Tokenized-Single-Line-No-unks.txt 
    -rw-rw-r-- 1 ubuntu ubuntu 0 Jun  9 19:52 Full-Text-Tokenized-Single-Line-No-unks.txt
    

我尝试过的事情

  • 在较短的文件上运行完全相同的示例:有效
  • 使用 -e 修饰符:不起作用
  • 转义“<”和“>”:不起作用
  • 改为使用简单的模式行 ('s/foo/bar/g'):不起作用:返回零长度文件。

编辑(更多信息)

  • 返回码为0

  • sed 版本是 (GNU sed) 4.2.2

最佳答案

只需使用 awk,它专为处理由任意字符串分隔的记录而设计。使用 GNU awk 进行多字符 RS:

awk -v RS='<unk>' '{ORS=(RT?" ":"")}1' file

以上将输入拆分为由 <unk> 分隔的记录所以如果够的话<unk> s 存在于输入中,那么单个记录将足够小以适合内存。然后它打印每条记录,后跟一个空白字符,因此对数据的总体影响是所有 <unk> s 变成空白字符。

如果这种直接方法对您不起作用,那么是时候开始寻找替代解决方案了。

关于bash - 在大型 (30G) 单行文件上运行 sed 返回空输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44465844/

相关文章:

c - 不会创建简单的文本文件 [C,GCC]

ubuntu - 如何在nagios中使用JMX监控tomcat客户端?

node.js - react npm start 中的 BROWSER 环境变量不选择自定义浏览器

当值分配给变量时,Unix 中的正则表达式问题

linux - 尝试启动 Linux Bash 脚本时找不到命令

arrays - 如何将 Bash 数组的元素连接到分隔字符串中?

shell - 使用 sed 在匹配后插入行

linux - 根据特定列拆分列

bash - 如何检测脚本是否正在获取

bash - 按列组合多个文件,仅使用第一列一次