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

求符合多条件的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

逻辑说明

  1. 对w>=800的行,以w,h,y为键存入数组,仅保留每个键对应x值最大的整行数据;
  2. w<800的行直接输出,无需处理;
  3. 最后输出筛选后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:34:53