awk报错‘illegal statement at source line 1’:按stuRec拆分XML求助
修复XML拆分脚本的语法错误与逻辑问题
错误根源
你触发的awk: illegal statement at source line 1错误由两个语法问题导致:
- 运算符误用:
if (n % 1 = 0)中用了赋值运算符=,而非比较运算符==,这是直接的语法违规。 - 正则拼接错误:
$0 ~ "</" element ">"的写法不符合awk字符串拼接规则,无法被正确解析。
此外原脚本还存在XML结构不完整的问题:拆分后的文件会缺失根元素闭合标签,无法被XML工具正常识别。
修正后的完整脚本
以下脚本解决了语法问题,同时保证每个拆分文件是合法XML,且每个文件最多包含100条stuRec记录(不足100条时生成单个文件):
awk -v target_elem="stuRec" -v batch_size=100 ' BEGIN { file_num = 1 record_count = 0 # 初始化第一个输出文件的XML头部 print "<?xml version=\"1.0\"?>" > "output/part_" file_num ".xml" print "<studentData>" > "output/part_" file_num ".xml" } # 匹配stuRec开始标签,计数加1 /<target_elem>/{ record_count++ } # 将当前行写入目标文件 { print > "output/part_" file_num ".xml" } # 匹配stuRec结束标签,判断是否需要切换文件 /<\/target_elem>/{ if (record_count % batch_size == 0) { # 闭合当前文件的根元素 print "</studentData>" > "output/part_" file_num ".xml" close("output/part_" file_num ".xml") # 初始化新文件 file_num++ print "<?xml version=\"1.0\"?>" > "output/part_" file_num ".xml" print "<studentData>" > "output/part_" file_num ".xml" } } # 脚本结束时闭合最后一个文件的根元素 END { print "</studentData>" > "output/part_" file_num ".xml" close("output/part_" file_num ".xml") } ' student_records.xml
核心改进说明
- 语法修复:替换
=为==,调整正则匹配方式为awk可解析的变量嵌入格式。 - 合法XML结构:每个输出文件都包含完整的XML声明、根元素开头与闭合标签,确保文件可正常解析。
- 批量拆分逻辑:每处理100条
stuRec自动切换到新文件,不足100条的剩余记录会归入最后一个文件。 - 资源管理:使用
close()关闭已完成的文件,避免因打开过多文件句柄导致报错。
测试验证
针对你提供的2条记录的示例XML,执行脚本后会生成output/part_1.xml,包含完整的XML结构和全部2条记录,符合“最少生成1个文件”的要求。
内容的提问来源于stack exchange,提问作者Trango
相关产品推荐
相关产品推荐

