awk:使用其他文件过滤文件

时间:2013-12-20 00:03:34

标签: bash awk

我正在尝试使用其他文件过滤文件。 我有一个文件d3_tmp和m2p_tmp;它们如下:

$ cat d3_tmp 
0x000001     0x4d    2
0x1107ce     0x4e    2
0x111deb     0x6b    2

$ cat m2p_tmp 
mfn=0x000001 ==> pfn=0xffffffffffffffff
mfn=0x000002 ==> pfn=0xffffffffffffffff
mfn=0x000003 ==> pfn=0xffffffffffffffff

我想在m2p_tmp中打印出第二列不等于d3_tmp第一列的行。 (文件用\ t和=)分开

所以期望的结果是:

  mfn=0x000002 ==> pfn=0xffffffffffffffff
  mfn=0x000003 ==> pfn=0xffffffffffffffff

但是,在我使用以下awk命令之后:

awk -F '[\t=]' ' FNR==NR { print $1; a[$1]=1; next } !($2 in a){printf "%s \t 0\n", $2}'     d3_tmp  m2p_tmp 

结果是:

0x000001  
0x1107ce  
0x111deb  
0x000001     0
0x000002     0
0x000003     0

我不确定为什么“$ 2 in a”不起作用。 有人可以帮忙吗?

非常感谢!

1 个答案:

答案 0 :(得分:2)

使用awk

awk 'NR==FNR{for (i=1;i<=NF;i++) a[$i];next} !($2 in a)' d3_tmp FS="[ =]" m2p_tmp

a [$ i]用于将文件d3_tmp中的所有项目收集到数组a中,NR == FNR用于控制集合仅关注d3_tmp。 在第二部分中,将FS设置为空格或“=”,并比较文件m2p_tmp中的$ 2是否在此数组a中,如果在,则打印它。

问题已被编辑,所以我也必须更改代码。

awk 'NR==FNR{a[$1];next} !($2 in a)' d3_tmp FS="[ \t=]" m2p_tmp