如何用Awk筛选file1中与file2指定列不匹配的行?
Awk筛选不匹配列行的修正方案
问题根源
原脚本存在两个关键错误:
- Awk中不存在
not关键字,判断元素不在数组中需使用!逻辑非运算符 - 文件顺序颠倒:
NR==FNR会优先处理第一个传入的文件,而需求是基于file2的列筛选file1,因此file2应放在参数首位
修正后的可行脚本
方案1:直接筛选不匹配行
awk -F"\t" 'NR==FNR{a[$1 "\t" $2 "\t" $4 "\t" $5]; next} !($1 "\t" $2 "\t" $4 "\t" $5 in a)' file2 file1 > output
方案2:用变量拼接键(更易维护)
awk -F"\t" 'NR==FNR{key=$1 FS $2 FS $4 FS $5; a[key]; next} {key=$1 FS $2 FS $4 FS $5; if (!(key in a)) print}' file2 file1 > output
脚本说明
-F"\t":指定制表符为字段分隔符NR==FNR{...; next}:处理第一个文件(file2),将第1、2、4、5列拼接成字符串作为数组a的键存入,next跳过后续逻辑!($1 "\t" $2 "\t" $4 "\t" $5 in a):处理file1时,判断当前行目标列的拼接字符串是否不在数组a中,满足条件则打印该行
内容的提问来源于stack exchange,提问作者Opus_francigenum
相关产品推荐
相关产品推荐

