求符合多条件的awk脚本:提取图像参数并保留最大x值行
完善AWK脚本实现图像参数筛选需求
需求说明
- 提取含
code(wxy)行的w、h、x、y参数; - 筛选出
w >= 250的行; - 找出
w >= 800且w、h、y值相同但x值不同的行对; - 在每对中仅保留x值更大的行。
当前已完成前两步,需完善脚本实现第四步需求。
输入文本
0: 1920x1664+0+0 867.6,708.6 751192 code(abc) 633: 892x584+1002+922 1447.5,1213.5 520928 code(wxy) 632: 892x584+71+922 516.5,1213.5 520928 code(wxy) 21: 892x485+1002+376 1447.5,618.0 432620 code(wxy) 20: 892x485+71+376 516.5,618.0 432620 code(wxy) 15: 429x144+535+155 749.0,226.5 61776 code(wxy) 16: 428x144+1001+155 1214.5,226.5 61632 code(wxy) 17: 428x144+1467+155 1680.5,226.5 61632 code(wxy) 14: 428x144+70+155 283.5,226.5 61632 code(wxy) 1230: 892x60+71+1522 516.5,1551.5 53520 code(abc) 1231: 892x60+1002+1522 1447.5,1551.5 53520 code(abc) 19: 892x45+1002+330 1447.5,352.0 40140 code(wxy) 630: 892x45+71+876 516.5,898.0 40140 code(wxy) 631: 892x45+1002+876 1447.5,898.0 40140 code(wxy) 18: 892x45+71+330 516.5,352.0 40140 code(wxy) 4: 274x40+1620+111 1756.5,130.5 10960 code(wxy) 2: 144x40+1332+111 1403.5,130.5 5760 code(wxy) 3: 140x40+1478+111 1547.5,130.5 5600 code(wxy)
当前脚本
awk -F[" x+"] '/code\(wxy\)/{print $2,$3,$4,$5}' | sort -k4 -k3 -n | awk '$1>=250{print $1,$2,$3,$4}'
当前输出
274 40 1620 111 428 144 70 155 429 144 535 155 428 144 1001 155 428 144 1467 155 892 45 71 330 892 45 1002 330 892 485 71 376 892 485 1002 376 892 45 71 876 892 45 1002 876 892 584 71 922 892 584 1002 922
期望输出
274 40 1620 111 428 144 70 155 429 144 535 155 428 144 1001 155 428 144 1467 155 892 45 1002 330 892 485 1002 376 892 45 1002 876 892 584 1002 922
解决方案
可以通过在管道末尾添加一段AWK逻辑,利用数组记录相同w,h,y组合下的最大x值,最终只保留符合要求的行:
awk -F[" x+"] '/code\(wxy\)/{print $2,$3,$4,$5}' | sort -k4 -k3 -n | awk ' $1>=250 { # 用w,h,y作为唯一键,区分不同分组 key = $1 "," $2 "," $4 if ($1 >= 800) { # 仅保留当前分组中x最大的行 if (!max_x[key] || $3 > max_x[key]) { max_x[key] = $3 keep_line[key] = $0 } } else { # w<800的行直接输出 print $0 } } END { # 输出w>=800分组中保留的行 for (k in keep_line) print keep_line[k] }' | sort -k4 -k3 -n
逻辑说明
- 对
w>=800的行,以w,h,y为键存入数组,仅保留每个键对应x值最大的整行数据; w<800的行直接输出,无需处理;- 最后输出筛选后的
w>=800行,并通过sort保持和原输出一致的排序规则。
如果想一步完成所有操作,也可以用单个AWK脚本实现:
awk -F[" x+"] ' /code\(wxy\)/ && $2 >= 250 { w=$2; h=$3; x=$4; y=$5 key = w "," h "," y if (w >= 800) { if (!max_x[key] || x > max_x[key]) { max_x[key] = x line[key] = w " " h " " x " " y } } else { res[++cnt] = w " " h " " x " " y } } END { for (i=1; i<=cnt; i++) print res[i] for (k in line) print line[k] }' input.txt | sort -k4 -k3 -n
内容的提问来源于stack exchange,提问作者Rasec Malkic
相关产品推荐
相关产品推荐

