awk有两个文件,一个可能是空的

时间:2013-06-08 01:28:50

标签: awk grep

我有两个文件,file1file2file1是单词的黑名单,file2是制表符分隔的。我想打印出file2中第一列和第二列与file1中的任何一行都不匹配的行。有时file1为空,在这种情况下,我想打印所有file2

我相信这可以用grep -v完成,我很好奇。但我真正感兴趣的是如何使用awk执行此操作。我试过了

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

但是当file1为空时失败,因为在这种情况下FNR==NR在阅读file2时感到满意。这个问题困扰了我很长一段时间,所以任何帮助都会非常感激!

2 个答案:

答案 0 :(得分:2)

您可以尝试以下内容:

awk 'FILENAME==ARGV[1]{a[$0]++;next}!($1 in a||$2 in a)' file1 file2

有点像this 丑陋的 兄弟。

答案 1 :(得分:0)

假设合理的POSIX兼容版awk,例如GNU awk或BSD(Mac OS X)awk,请使用FILENAME和ARGV[1]代替NR和FNR :

awk 'FILENAME == ARGV[1]                           { file1 = FILENAME }
     FILENAME == file1                             { a[$0]++; }
     FILENAME != file1 && !($1 in a) && !($2 in a) { print }' file1 file2

严格来说,{ print }可能会被取消,但是当它出现时更清楚(至少以我的思维方式)。