AWK脚本中Hash table相关语法错误排查求助
AWK脚本语法错误排查与修正
报错信息
awk: syntax error at source line 30 source file test.awk
context is
dealer_schedule[last_name] = >>> [ <<< date, time, am_pm, first_name, last_name]
awk: illegal statement at source line 30 source file test.awk
awk: syntax error at source line 33 source file test.awk
错误原因汇总
你的脚本问题主要来自awk 3.4的旧版语法限制,以及几个基础语法误用:
- awk 3.4不支持**数组字面量
[元素1,元素2]**的赋值方式,这是新版gawk才有的特性 - 不存在
assoc()函数,awk的关联数组直接使用即可,无需显式初始化 - 文件读取不能用
open()和for (line in 文件对象),要改用awk标准的getline方式 - 逻辑运算符需用
&&而非and,旧版awk不支持and作为逻辑判断符 split()函数用法错误,正确格式是split(字符串, 目标数组, 分隔符),返回值是元素数量,不能赋值给数组名- 数组索引未正确初始化,比如
mylie_info[i]里的i没有自增逻辑 - 文件关闭要用
close("文件名"),不是对象调用.close()方法
修正后的完整脚本
#!/usr/bin/awk -f BEGIN { # 读取Mylie的信息到关联数组 read_mylie_info("Mylie.txt", mylie_info) } { # 从文件名提取前4位作为日期 date = substr(FILENAME, 1, 4) # 分割行数据到fields数组 split($0, fields, "|") time = fields[2] am_pm = fields[3] first_name = fields[4] last_name = fields[5] # 用复合键模拟多维数组存储经销商排班 if (!(last_name in dealer_record_count)) { dealer_record_count[last_name] = 0 } dealer_record_count[last_name]++ idx = dealer_record_count[last_name] dealer_schedule[last_name, idx, "date"] = date dealer_schedule[last_name, idx, "time"] = time dealer_schedule[last_name, idx, "am_pm"] = am_pm dealer_schedule[last_name, idx, "first"] = first_name dealer_schedule[last_name, idx, "last"] = last_name # 匹配Mylie的游玩时间,统计经销商次数 for (i in mylie_info) { if (date == mylie_info[i, "date"] && time == mylie_info[i, "time"] && am_pm == mylie_info[i, "am_pm"]) { dealer_counts[last_name]++ } } } END { # 输出经销商统计结果 print "dealer,count" > "Notes_Dealer_Analysis.txt" for (dealer in dealer_counts) { print dealer "," dealer_counts[dealer] >> "Notes_Dealer_Analysis.txt" } close("Notes_Dealer_Analysis.txt") # 输出Mylie游玩时在岗的经销商排班 print "date,time,am_pm,first_name,last_name" > "Dealers_working_during_losses.txt" for (dealer in dealer_record_count) { for (idx=1; idx<=dealer_record_count[dealer]; idx++) { # 检查当前经销商的这条记录是否匹配Mylie的时间 for (i in mylie_info) { if (dealer_schedule[dealer, idx, "date"] == mylie_info[i, "date"] && dealer_schedule[dealer, idx, "time"] == mylie_info[i, "time"] && dealer_schedule[dealer, idx, "am_pm"] == mylie_info[i, "am_pm"]) { print dealer_schedule[dealer, idx, "date"] "," \ dealer_schedule[dealer, idx, "time"] "," \ dealer_schedule[dealer, idx, "am_pm"] "," \ dealer_schedule[dealer, idx, "first"] "," \ dealer_schedule[dealer, idx, "last"] >> "Dealers_working_during_losses.txt" break } } } } close("Dealers_working_during_losses.txt") } # 读取Mylie信息的函数 function read_mylie_info(filename, arr, line, fields, i) { i = 0 while ((getline line < filename) > 0) { split(line, fields, "|") i++ arr[i, "date"] = fields[1] arr[i, "time"] = fields[2] arr[i, "am_pm"] = fields[3] } close(filename) }
关键修正点说明
- 数组存储方式调整:旧版awk不支持多维数组的直接字面量赋值,改用
关联数组+复合键(比如dealer_schedule[last_name, idx, "date"])来模拟多维存储,兼容所有awk版本。 - 文件读取逻辑替换:用
getline循环读取文件内容,这是awk标准的文件读取方式,避免了旧版不支持的文件对象遍历语法。 - 逻辑运算符替换:把
and换成&&,符合awk的标准语法规范。 - split函数修正:正确使用
split($0, fields, "|"),不再错误地将返回值赋值给数组名。 - 数组索引初始化:在读取Mylie信息时,用计数器
i来维护每条记录的索引,避免无意义的空索引问题。 - 文件关闭修正:使用
close("文件名")来关闭打开的文件,避免资源泄漏。
内容的提问来源于stack exchange,提问作者CApple
相关产品推荐
相关产品推荐

