【发布时间】:2017-01-10 06:59:10
【问题描述】:
屏蔽问题:我需要从单个大文本文件(input.txt,100+ MB)中定位和屏蔽(即替换为“XXX”)某些术语(单词/表达式)。我需要查找的术语 (10K+) 保存在单个文件 (to_mask.txt) 中。我怎样才能有效地执行此操作?
我想分两步做:首先找到实际包含术语的行
grep -Ff to_mask.txt -o -n input.txt
接下来检查输出并进行实际替换(术语->“XXX”)。
这似乎有点乏味,能不能用更聪明的方式来做?
欢迎任意组合基本命令(grep、sed、awk、one-line-perl)!
更新:
MarcoS、Kenavoz、Ed Morton 和 Sobrique 都提供了可行的解决方案,谢谢! 我选择 Sobrique 的解决方案作为我接受的解决方案,因为考虑到我的数据,它比其他解决方案快得多。它可能无法处理一些特殊情况,但我确信它可以扩展到能够这样做,而且它可以在当前条件下完成手头的工作。
更新 2:
作为参考,以下是 Kenavoz 提供的解决方案:
sed -f <(sed 's~^~s\~~;s~$~\~XXX\~~' to_mask.txt) input.txt
【问题讨论】:
-
我认为您应该首先熟悉Scunthorpe Problem 的概念,然后用不止一个班轮来解决这个问题(尤其是在涉及其他最终用户的情况下)。此外,口罩的过滤通常使用 0 b 5 C u r 1 + y 进行环绕,计算机难以发现,而人类往往能够阅读。
-
感谢@Draw Sloan,我对垃圾邮件问题有点熟悉。但是,我需要用尽可能少的库来实现这一点(它将在客户端运行),所以为了简单起见,我可能会失去一些效率。