首页/系统/Linux 运维命令速查/awk 双文件处理(NR==FNR)
文本处理77 条

awk 双文件处理(NR==FNR)

经典套路:先读小文件建索引/过滤集,再流式处理大文件——按列 join 不需要排序,比 join 命令更实用。

Linux 运维命令速查系统更新于 2026-10-12
用途两文件关联(过滤/映射/计数)
语法awk 'NR==FNR{建索引; next} {处理}' 小文件 大文件
原理NR 累计行号、FNR 当前文件行号:第一个文件里两者相等

按列映射

按列映射
awk 'NR==FNR{a[$1]=$2; next} {print $1, a[$1]}' map.txt data.txt

白名单过滤

白名单过滤
awk 'NR==FNR{ok[$1]; next} ($1 in ok)' allow.txt access.log

分组计数

分组计数
awk 'NR==FNR{u[$1]; next} ($1 in u){n[$1]++} END{for(k in n) print k, n[k]}' users.txt logs.txt
比 join 强:输入无需排序、输出格式自由;比 grep -f 强:能带出关联字段。

易错点

  • a[$1]=$2 只保留最后一个值:一对多场景要改成 a[$1]=a[$1]" "$2 或直接计数
  • 第二个文件段的处理动作写空({})会什么都不输出:先在小样本上验证

数据来源与参考

  • man 1 awk(GNU gawk 手册)
  • gawk 官方用户指南(gnu.org/software/gawk/manual)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌