如何使用AWK命令将角色详情文本转换为指定格式的CSV文件?
角色详情转CSV格式问题解决
需求说明
输入的角色详情文本如下:
roledetails="name: CLD:HYB_Y_BASIS_ADMIN description: Basis Admin readOnly: <null> roleReferences: - description: desc1 name: AuthGroup_Administrator roleTemplateAppId: it!b2455 roleTemplateName: AuthGroup_Administrator - description: Desc2 name: AuthGroup_BusinessExpert roleTemplateAppId: it!b2455 roleTemplateName: AuthGroup_BusinessExpert "
需要转换成指定格式的CSV,要求将描述字段中的逗号替换为冒号避免格式冲突,期望输出:
Collection Role, Desc,Role_Name,App_Id, Role_Template CLD:HYB_Y_BASIS_ADMIN, desc1, AuthGroup_Administrator,it!b2455,AuthGroup_Administrator CLD:HYB_Y_BASIS_ADMIN, desc2, AuthGroup_BusinessExpert,it!b2455,AuthGroup_BusinessExpert
原代码问题分析
你写的awk脚本存在几个关键问题:
- getline顺序错误:遇到
-开头的行是description,但你直接先读取roleTemplateAppId,导致后续所有字段取值错位 - 未处理描述字段的逗号替换:没有实现需求中“逗号转冒号”的逻辑
- 缺少表头输出:没有生成CSV的表头行
- 字段顺序不符合要求:输出的字段顺序和期望的不一致
- awk追加文件的写法兼容性差:部分awk版本不支持
>>这种直接在printf里追加的写法
修正后的解决方案
下面是可以正常工作的脚本,完全满足需求:
declare fullfilepath=$(pwd)/test1.csv # 先写入CSV表头 echo "Collection Role, Desc,Role_Name,App_Id, Role_Template" > "$fullfilepath" # 处理角色详情并追加到CSV awk -F':[[:space:]]+' ' # 捕获主角色名称 /^[[:space:]]*name:/ { main_role = $2 } # 处理每个子角色项 /^[[:space:]]*- description:/ { # 将描述中的逗号替换为冒号 gsub(/,/, ":", $2) curr_desc = $2 # 依次读取后续的name、roleTemplateAppId、roleTemplateName行 getline curr_role_name = $2 getline curr_app_id = $2 getline curr_role_template = $2 # 按要求格式输出一行 print main_role ", " curr_desc ", " curr_role_name ", " curr_app_id ", " curr_role_template } ' <<< "$roledetails" >> "$fullfilepath"
脚本说明
- 先通过
echo写入CSV表头,确保格式正确 - 使用awk匹配主角色的
name行,保存主角色名称 - 匹配每个子角色的
description行时,先用gsub替换逗号为冒号 - 依次用
getline读取后续的三个字段行,确保取值正确 - 最后按需求的字段顺序拼接输出,并追加到CSV文件中
内容的提问来源于stack exchange,提问作者Lord OfTheRing
相关产品推荐
相关产品推荐

