我正在尝试使用其他文件过滤文件。 我有一个文件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”不起作用。 有人可以帮忙吗?
非常感谢!
答案 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