1

我有两个文件,正在尝试制作第三个。在 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

就是这么丑

4

3 回答 3

4
awk -F= 'NR==FNR{a[$1]++;next}!($1 in a)' fileB fileA > fileC
于 2013-06-18T15:35:00.830 回答
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=

没有出现在您想要的输出中,尽管我认为它应该出现。

于 2013-06-18T15:27:34.167 回答
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=
于 2013-06-18T17:23:13.260 回答