如何提高此awk脚本的速度

如何提高此awk脚本的速度,awk,Awk,我有一个大文件,比如说file1.log,看起来像这样: 1322 a@gmail.com 2411 b@yahoo.com a@gmail.com c@yahoo.com 还有一个较小的文件,如file2.log,如下所示: 1322 a@gmail.com 2411 b@yahoo.com a@gmail.com c@yahoo.com 事实上,file1.log包含大约6500000行,而file2.log包含大约140000行 我想查找file2.log中没有出现在file1.l

我有一个大文件,比如说
file1.log
,看起来像这样:

1322 a@gmail.com
2411 b@yahoo.com
a@gmail.com
c@yahoo.com
还有一个较小的文件,如
file2.log
,如下所示:

1322 a@gmail.com
2411 b@yahoo.com
a@gmail.com
c@yahoo.com
事实上,
file1.log
包含大约6500000行,而
file2.log
包含大约140000行

我想查找
file2.log
中没有出现在
file1.log
中的所有行。我写了这个awk命令:

awk 'NR==FNR{c[$2]++} NR!=FNR && c[$1]==0 {print $0}' file1.log file2.log > result.log'
大约半小时后,我发现命令仍在运行,
less result.log
显示
result.log
为空。
我想知道是否有什么我可以做的更快的工作

将较小的文件
file2
散列到内存中。记住:否则怎么可能

输出:

c@yahoo.com

如果对文件进行排序,则可以使用
comm
仅打印第二个文件中存在的具有以下内容的行:

comm -13 <(awk '{ print $2 }' file1.log | sort) <(sort file2.log)

comm-13我认为最简单的就是一个简单的
grep
管道

grep -Fwof file2 file1 | grep -Fwovf - file2
您也可以只提取
file1
的第二列,然后再次使用上述命令的最后一部分:

awk '{print $2}' file1 | grep -Fwovf - file2
或者一个awk中的所有内容:

awk '(NR==FNR){a[$2]; next}!($1 in a)' file1 file2

是的,要快得多。real 3.051s用户2.734s系统0.281感谢您的评论。我测试它,它比那些awk竞争对手慢。
cut-d'-f2 file1.log
应该比
awk'{print$2}'file1.log
快得多,因为
cut
不像awk那样分析输入并分配变量(NR、FNR、NF、$0、$1等)。