如何使用awk执行多操作编辑文本文件并按规则过滤行
使用AWK实现指定规则的文本过滤
没问题,用AWK处理这种按列过滤的需求简直是得心应手!我给你一步步拆解实现方法:
核心逻辑说明
我们需要排除符合以下两个条件任一的行,保留剩下的行:
- 条件1:第4列数值小于10,且第5列分组为
BA - 条件2:第4列数值小于5,且第5列分组为你指定的目标组
基础实现命令
假设你的源文件是input.txt,过滤后的结果输出到output.txt,执行以下命令即可(记得把YOUR_TARGET_GROUP替换成你实际要指定的分组名称,比如CA、DA这类):
awk -F'\t' '!((($4 < 10) && ($5 == "BA")) || (($4 < 5) && ($5 == "YOUR_TARGET_GROUP")))' input.txt > output.txt
命令细节解释
-F'\t':告诉AWK使用制表符作为列分隔符,这样才能准确识别第4、5列(AWK默认用空格分隔,不指定的话会出错)!():整个条件取反——因为我们要排除符合过滤规则的行,所以保留不满足规则的行- 第一个过滤分支:
($4 < 10) && ($5 == "BA")精准匹配需要排除的第一种情况 - 第二个过滤分支:
($5 == "YOUR_TARGET_GROUP")替换成你的目标分组即可,比如要过滤分组CA就改成$5 == "CA"
扩展:支持多个指定分组
如果你的"指定组"不止一个(比如要同时排除第4列<5且分组为CA或DA的行),可以用正则匹配来简化:
awk -F'\t' '!((($4 < 10) && ($5 == "BA")) || (($4 < 5) && ($5 ~ /^(CA|DA)$/)))' input.txt > output.txt
这里$5 ~ /^(CA|DA)$/表示第5列是CA或DA的行,你可以根据需要添加更多分组,用|分隔即可。
小提示
如果你的第4列可能存在非数值内容(比如表头),可以先跳过表头行,或者加个判断确保只处理数值行:
# 跳过第一行表头 awk -F'\t' 'NR>1 && !((($4 < 10) && ($5 == "BA")) || (($4 < 5) && ($5 == "YOUR_TARGET_GROUP")))' input.txt > output.txt
内容的提问来源于stack exchange,提问作者user9378401
相关产品推荐
相关产品推荐

