【问题标题】:awk: filter a file with another fileawk:用另一个文件过滤一个文件
【发布时间】:2025-11-23 18:10:01
【问题描述】:

我正在尝试用另一个文件过滤一个文件。 我有一个文件 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”不起作用。 有人可以帮忙吗?

非常感谢!

【问题讨论】:

  • 有一个尾随空格。 0x000002 != 0x000002
  • 非常感谢威廉!我明白了!
  • 您更改了主题,源文件现在格式不同了。你能在新的请求中讨论吗?否则,如果他们看到提供的解决方案,它会混淆其他人。

标签: bash awk


【解决方案1】:

使用 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

【讨论】:

  • 这很有趣。你能解释一下!($ 2 in a)吗?这是哪里来的? !(...) 是什么意思?
  • 表示第二列的项不在数组a中。
  • @yaeyong,解释一下,请查收
【解决方案2】:
awk -v FS="[\t= ]"  ' FNR==NR { a[$1]=$1; next } !($2 in a){print $0}'     d3_tmp  m2p_tmp
mfn=0x000002 ==> pfn=0xffffffffffffffff
mfn=0x000003 ==> pfn=0xffffffffffffffff

【讨论】: