2013-12-20 40 views
1

我想用另一个文件过滤文件。 我有一个文件d3_tmp和m2p_tmp;它们分别是:awk:用另一个文件过滤文件

$ 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的第一列。 (该文件被分割以\吨和=)

所以所需的结果是:

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在一个”不起作用。 任何人都可以帮忙吗?

非常感谢!

+1

有一个尾随空间。 '0x000002'!='0x000002' –

+0

非常感谢你威廉!我知道了! – Mike

+0

您更改了主题,现在源文件格式不同。你可以在新的要求中讨论吗?否则,如果他们看到提供的解决方案,它会混淆他人。 – BMW

回答

2

用awk

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

一个[$ i]的用于收集文件d3_tmp所有物品放入数组,NR == FNR用于控制集合只注重d3_tmp。在第二部分中,将FS设置为空格或“=”,并比较文件m2p_tmp中的$ 2是否在此数组a中,如果是,则将其打印出来。

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

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

这很有趣。你能解释一下吗(一个$ 2)?这是从哪里来的?和(!)是什么意思? – jaeyong

+0

这意味着第二列中的项目不在数组a中。 – Mike

+0

@yaeyong,请说明一下,请检查 – BMW

相关问题