使用awk解析忽略值的两个文件

时间:2013-06-18 15:23:12

标签: awk grep

我有两个文件,我正在尝试制作第三个文件。在fileA中,我有一个静态的数字列表。在fileB中,我也有一个静态的数字列表。我想使用awk从fileB中获取数字,通过fileA解析,并创建一个fileC。 FileC将是fileA忽略它从fileB看到的任何内容。

更多文件*

fileA

99882105030=10.10.2.3=
99882152121=10.10.2.3=
99882152122=10.10.2.3=
99882152123=10.10.2.3=
99882152124=10.10.2.3=
99882278940=10.10.2.3=
99882278969=10.10.2.3=
99883340691=10.10.2.3=
99883349708=10.10.2.3=
99883349755=10.10.2.3=

fileB (numbers that should be ignored)

99882105030
99882152121
99882152122
99882152123

fileC (file created from output of fileA and fileB)

99882278940=10.10.2.3=
99882278969=10.10.2.3=
99883340691=10.10.2.3=
99883349708=10.10.2.3=
99883349755=10.10.2.3=

到目前为止,我已经尝试过:

awk 'FNR==NR { a[$NF]; next } ($NF in a)' fileB fileA > fileC

没有运气。我知道我可以grep -v -E“99882105030 | 99882152121”...到我心里的内容,但这个文件可能变得很大,我不想做一个for循环。任何人?

perl -p -e 's:\n:\|:g' fileB |\
sed 's:^:grep -v -E ":g;s:|$:":g;s:$: fileA > fileC:g | sh

太难看了

3 个答案:

答案 0 :(得分:4)

awk -F= 'NR==FNR{a[$1]++;next}!($1 in a)' fileB fileA > fileC

答案 1 :(得分:3)

可以使用awk完成,但在这种情况下,我认为grep -f可以解决问题:

$ grep -wvf fileB fileA
99882152124=10.10.2.3=
99882278940=10.10.2.3=
99882278969=10.10.2.3=
99883340691=10.10.2.3=
99883349708=10.10.2.3=
99883349755=10.10.2.3=
  • -v用于反向匹配。
  • -f用于文件匹配。
  • -w进行单词匹配。
  • > fileC万一你需要它。我发布了没有此重定向的代码,直接显示输出。

注意该行

99882152124=10.10.2.3=

没有出现在你想要的输出中,虽然我认为应该。

答案 2 :(得分:1)

GNU sed

sed -r 's#(.*)#/\1/d#' fileB | sed -f - fileA

..输出:

99882152124=10.10.2.3=
99882278940=10.10.2.3=
99882278969=10.10.2.3=
99883340691=10.10.2.3=
99883349708=10.10.2.3=
99883349755=10.10.2.3=