如何用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
需要筛选满足以下两个条件的行:
- 第三列数值大于80
- 第一列点(
.)之前的部分与第二列点之前的部分不同
期望结果:
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
相关产品推荐
相关产品推荐

