如何用awk根据二进制模式文件删除文本文件对应行
使用AWK过滤文件行的解决方案
刚好这个场景是AWK的拿手好戏,处理几千行的文件完全轻松搞定,给你直接上实用的命令和详细解释:
核心命令
如果你的fileB每行就是纯0或1(没有额外前缀),用这个命令:
awk 'NR==FNR{b[NR]=$0; next} b[FNR]==1' fileB fileA
要是fileB里每行带类似示例的Line X:前缀,那就调整成只提取实际的0/1值(取每行最后一个字段):
awk 'NR==FNR{b[NR]=$NF; next} b[FNR]==1' fileB fileA
命令逐段解释
我拆解开给你讲明白逻辑:
NR==FNR:这是AWK里判断当前处理第一个输入文件的经典写法——NR是全局累计行号,FNR是当前文件的行号,只有处理第一个文件时两者会相等b[NR]=$0:把第一个文件(fileB)的每行内容(或用$NF取最后一个字段)存入数组b,用行号NR做下标,这样就能和fileA的行号精准对应next:跳过后面的逻辑,直接处理下一行,确保第一个文件只做存数组的操作b[FNR]==1:处理第二个文件(fileA)时,检查对应行号在数组b里的值是不是1,满足条件就自动打印当前行(AWK默认会输出符合条件的行)
示例验证
用你给出的示例文件测试:
fileA内容:
Line 1: 123456
Line 2: 789012
Line 3: 345678
Line 4: 901234
fileB内容:
Line 1: 1
Line 2: 0
Line 3: 0
Line 4: 1
运行带$NF的命令后,输出结果就是:
Line 1: 123456
Line 4: 901234
完全匹配你的需求!
进阶:直接修改原文件
如果想把结果直接覆盖回fileA,建议用临时文件中转(避免直接覆盖导致数据丢失):
awk 'NR==FNR{b[NR]=$NF; next} b[FNR]==1' fileB fileA > temp_file && mv temp_file fileA
这个方法安全又高效,我平时处理日志、视频追踪文件这类批量行过滤需求经常用它~
内容的提问来源于stack exchange,提问作者César A
相关产品推荐
相关产品推荐

