近期遇到个场景,需要在某个较大的文本中匹配特定的一批字符串,并将其滤除或者打印出来。

使用了shell的grepawk,对于这两个工具的文本处理效率和方法有了些基本的认识。

grep

最初的想法是grep命令,即:

grep -Ff A B	#打印文件A和文件B中有相同字符串的行
grep -vFf A B	#打印文件B中有,但是文件A中没有的行

由于待处理的文件有百万甚至千万行,直接grep导致将内存爆炸。测试使用的2G内存VPS直接进程killed,而使用了32G内存的物理机,在运行一段时间后,直接宕机。ミ゚Д゚彡

awk

后续使用了awk中的匹配功能,整体内存使用在1G左右,效率也高很多。

awk 'ARGIND==1 {a[$0]} ARGIND>1&&($3 in a) {print $0}' A B
#ARGIND表示当前文件序号
#将A文件的$0赋值到数组a,如果B文件某行的$3有在数组a中出现,则打印该行;
awk 'ARGIND==1 {a[$0]} ARGIND>1&&!($3 in a) {print $0}' A B
#将A文件的$0赋值到数组a,如果B文件某行的$3没有在数组a中出现,则打印该行;

如此这般,awk的文本处理效率确实很高,使用方法十分灵活。好好学习这个吧~