2

私は2つのファイルを持っていfile1ますfile2. file1単語のブラックリストで、file2タブ区切りです。file21列目と 2 列目が のどの行とも一致しない行だけを印刷したいと思い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

awkGNUawkや BSD (Mac OS X)などの合理的に POSIX 準拠のバージョンを想定して、NR や FNR の代わりにawkFILENAME を使用します。ARGV[1]

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 に答える