AWK非单行控制脚本处理多文件对比及筛选记录问题求助
问题排查与修正方案
原脚本核心错误
- awk中逻辑与运算符为
&&,不存在AND关键字 - 不能将命令行过滤逻辑直接写入awk脚本的规则块中,
'FNR==1 || !$2 in a' file1 file2属于命令行写法,放在脚本内会触发语法错误 - 全局重置
NR/FNR属于无效操作,这两个是awk内置计数变量,手动赋值会打乱双文件读取的计数逻辑 - 双文件处理的流程完全混乱:需要先读取file2构建第2列的去重集合,再读取file1做过滤,二者要拆分为独立的规则块
修正后可用脚本
BEGIN { FS="\x01"; OFS="\x01"; RS="\x02\n"; ORS="\x02\n"; } # 通用规则:所有#开头的控制头直接打印,不管属于哪个文件 /^#/ { print; next; } # 第一个传入文件(file2)处理:将所有行的第2列存入哈希表 NR == FNR { a[$2] = 1; next; } # 第二个传入文件(file1)处理:匹配16开头且第2列不在file2的集合中就打印 /^16/ && !($2 in a) { print; }
运行方式
注意运行时要把file2放在前面,file1放在后面,顺序不能反:awk -f 你的脚本文件名.awk file2 file1
逻辑说明
- 控制头打印:所有#开头的行直接输出,满足打印控制头的需求
- 双文件处理逻辑:
- 利用
NR == FNR判断当前读取的是第一个传入的文件(即file2),遍历所有非控制头行,把第2列存入哈希表a - 读完file2后进入file1的处理逻辑,匹配行首为16、且第2列不在哈希表
a中的行,直接输出即可满足过滤需求
- 利用
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

