2

我有两个文件,file1file2. 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. 这是一个困扰我很长时间的问题,所以任何帮助将不胜感激!

4

2 回答 2

2

您可以尝试以下方法:

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

有点像这个丑陋兄弟姐妹。

于 2013-06-08T03:11:01.307 回答
0

假设一个合理的 POSIX 兼容版本,awk例如 GNUawk或 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 }可以省略,但是当它出现时会更清楚(至少在我的思维方式中)。

于 2013-06-08T01:40:18.220 回答