使用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 SUBSEP $2 SUBSEP $3作为唯一键,SUBSEP是AWK内置的数组下标分隔符,避免不同字段组合产生键冲突。 - 权限去重:通过二维数组
perms[key][$4]标记权限是否已存在,仅首次出现的权限会被加入列表。 - 权限列表拼接:对每个分组逐步拼接去重后的权限,用逗号分隔。
- 最终输出:遍历所有分组,按指定格式生成grant语句。
内容的提问来源于stack exchange,提问作者Yasser
相关产品推荐
相关产品推荐

