我有两个文件,file1
和file2
。 file1
是单词的黑名单,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
时感到满意。这个问题困扰了我很长一段时间,所以任何帮助都会非常感激!
答案 0 :(得分:2)
答案 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 }
可能会被取消,但是当它出现时更清楚(至少以我的思维方式)。