我正在尝试使用 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/