You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Awk筛选第三列>80且两列点前内容不同的行?

问题解决:筛选指定条件的文本行

问题场景

现有文件example_file,内容如下:

a2022.1 a2022.1 80
a2022.1 a2022.2 90
a2022.1 a2023.1 80
a2022.2 a2022.2 90
a2022.2 a2023.1 40
a2022.3 a2022.1 50
b20225.1 a2022.1 80

需要筛选满足以下两个条件的行:

  1. 第三列数值大于80
  2. 第一列点(.)之前的部分与第二列点之前的部分不同

期望结果:

a2022.1 a2023.1 80
b20225.1 a2022.1 80

之前的问题分析

你用awk '($3 > 80 && $1!=$2)' example_file只能排除两列完全相同的行,但无法区分a2022.1和a2022.2这种点前部分相同的情况;而awk '($3 > 80 && $1!~$2)' example_file失效,是因为$1!~$2是正则匹配,$1里的.是正则通配符(匹配任意单个字符),所以a2022.1会被a2022.2匹配到,导致无法排除目标行。

正确解决方案

需要先提取每一列点前的部分,再进行比较,以下两种方法均可实现:

方法1:使用split函数提取前缀

awk '$3 > 80 {split($1, a, "."); split($2, b, "."); if (a[1] != b[1]) print}' example_file
  • split($1, a, "."):将第一列按.分割,存入数组a,a[1]即为点前的部分
  • split($2, b, "."):同理提取第二列的点前缀
  • 比较a[1]和b[1],不同则输出该行

方法2:临时修改字段分隔符

awk -F '[ .]' '$5 > 80 && $1 != $3' example_file
  • -F '[ .]':将字段分隔符设为空格或.,此时原第一列的点前缀是$1,原第二列的点前缀是$3,原第三列数值是$5
  • 直接比较$1和$3是否不同,同时判断$5 > 80,满足条件则输出

内容的提问来源于stack exchange,提问作者zzz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 23:18:32