如何用awk实现字符串模糊匹配并计算对应计划收益
解决方案:用Awk处理双文件实现计划匹配与收益计算
核心思路
先从plans.txt中读取所有计划的月度费用并存储为关联数组;再遍历main.txt,根据服务器归属判断对应标准计划类型,统一替换原始计划名后,用使用数量乘以标准计划的费用计算收益。
完整Awk代码
BEGIN { # 定义服务器与对应标准计划的映射规则 server_map["server1.domain"] = "NewClusterA" server_map["server2.domain"] = "NewClusterA" server_map["server3.domain"] = "NewClusterB" server_map["server4.domain"] = "NewClusterB" # 输出表头,格式化对齐 printf "%-20s %-15s %-20s %s\n", "服务器", "计划数量", "标准计划名称", "收益" printf "%-20s %-15s %-20s %s\n", "--------", "----------", "-------------------", "------" } # 处理第一个文件plans.txt,存储计划费用 NR == FNR { plan_cost[$1] = $2 next } # 处理第二个文件main.txt,计算并输出结果 { server = $1 original_plan = $2 count = $3 # 跳过不在规则内的服务器 if (!(server in server_map)) next target_plan = server_map[server] # 校验原始计划是否属于对应集群(A/B) if ((target_plan == "NewClusterA" && original_plan !~ /ClusterA$/) || (target_plan == "NewClusterB" && original_plan !~ /ClusterB$/)) { next } # 计算收益 revenue = count * plan_cost[target_plan] # 格式化输出结果 printf "%-20s %-15d %-20s %.2f\n", server, count, target_plan, revenue }
使用步骤
- 将上述代码保存为
calculate_revenue.awk文件 - 在终端执行以下命令(需确保
plans.txt和main.txt在当前目录):
awk -f calculate_revenue.awk plans.txt main.txt
代码说明
- BEGIN块:初始化服务器-计划映射关系,输出对齐的表头。
- NR==FNR块:仅处理第一个输入文件
plans.txt,将计划名作为键、费用作为值存入数组,next跳过后续逻辑,避免干扰第二个文件的处理。 - main.txt处理块:提取每行的服务器、原始计划、数量字段,校验服务器是否符合规则、原始计划是否匹配对应集群,最后计算并输出格式化的结果。
示例输入与输出
示例plans.txt内容:
NewClusterA 100
OldClusterA 90
NewClusterB 150
OldClusterB 140
示例main.txt内容:
server1.domain OldClusterA 2
server2.domain NewClusterA 3
server3.domain OldClusterB 1
server4.domain NewClusterB 4
server5.domain NewClusterA 2 # 不在规则内,会被跳过
执行命令后输出:
服务器 计划数量 标准计划名称 收益 -------- ---------- ------------------- ------ server1.domain 2 NewClusterA 200.00 server2.domain 3 NewClusterA 300.00 server3.domain 1 NewClusterB 150.00 server4.domain 4 NewClusterB 600.00
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

