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

使用AWK实现多字段分组合并生成授权语句的技术问询

按字段分组生成SQL授权语句

输入数据

TRSSOEC TRBSOEC      ADICOES                        DELETE            TROEC
  TRSSOEC TRBSOEC      ADICOES                        INSERT            TROEC
  TRSSOEC TRBSOEC      ADICOES                        SELECT            TROEC
  SOBCXYZ SCHEMA1      AGENTES_CARGA                  INSERT            TROEC
  SOBCXYZ SCHEMA1      AGENTES_CARGA                  SELECT            TROEC
  YASU999 ASDF123      BS_ADICOES_SISCOMEX            UPDATE            TRBSOEC
  USER123 WAREHOU      BS_ADICOES_TRIBUTOS_BKP        DELETE            TRBSOEC
  USER123 WAREHOU      BS_ADICOES_TRIBUTOS_BKP        INSERT            TRBSOEC

需求

按第1、2、3字段分组,每组内去重第4字段(权限)后用逗号分隔,生成如下格式的SQL授权语句:

grant DELETE,INSERT,SELECT on TRBSOEC.ADICOES to TRSSOEC;
grant INSERT,SELECT on SCHEMA1.AGENTES_CARGA to SOBCXYZ;
grant UPDATE on ASDF123.BS_ADICOES_SISCOMEX to YASU999;
grant DELETE,INSERT on WAREHOU.BS_ADICOES_TRIBUTOS_BKP to USER123;

核心规则:grant <去重后逗号分隔的权限> on 字段2.字段3 to 字段1 ;

原代码问题

你写的AWK代码逻辑有误:仅通过逐行比较当前行与上一行字段来处理,无法累积同一组的所有权限,也未实现权限去重,因此无法生成正确的合并结果。

正确AWK实现

awk '
# 处理每一行,按$1,$2,$3分组存储权限,自动去重
{
    # 生成唯一分组键:用户+模式+表名
    key = $1 SUBSEP $2 SUBSEP $3
    # 用子数组记录该组已存在的权限,避免重复
    if (!perms[key][$4]) {
        perms[key][$4] = 1
        # 把权限追加到该组的权限列表
        if (perm_list[key] != "") perm_list[key] = perm_list[key] ","
        perm_list[key] = perm_list[key] $4
        # 保存该组的模式、表名、用户信息
        user[key] = $1
        schema[key] = $2
        table[key] = $3
    }
}

# 所有行处理完后,输出每个分组的授权语句
END {
    for (k in perm_list) {
        printf "grant %s on %s.%s to %s;\n", perm_list[k], schema[k], table[k], user[k]
    }
}
' test.txt

代码解释

  1. 分组键生成:用$1 SUBSEP $2 SUBSEP $3作为唯一键,SUBSEP是AWK内置的数组下标分隔符,避免不同字段组合产生键冲突。
  2. 权限去重:通过二维数组perms[key][$4]标记权限是否已存在,仅首次出现的权限会被加入列表。
  3. 权限列表拼接:对每个分组逐步拼接去重后的权限,用逗号分隔。
  4. 最终输出:遍历所有分组,按指定格式生成grant语句。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 04:27:42