Awk中多次访问自定义变量报错,如何解决?
Awk中自定义变量多次访问的语法问题
问题描述
假设有data.txt文件,内容如下:
1 2 2 3 3 4
执行以下Awk命令可以正常运行:
cat data.txt | awk 'sum=($1+$2), div1=(sum/$1) {print " sum: " sum " div1: " div1 " data: " $0}'
输出结果:
sum: 3 div1: 3 data: 1 2 sum: 5 div1: 2.5 data: 2 3 sum: 7 div1: 2.33333 data: 3 4
但尝试添加第三个变量引用时,执行命令:
cat data.txt | awk 'sum=($1+$2), div1=(sum/$1), div2=(sum/$2) {print " sum: " sum " div1: " div1 " div2: " div2 " data: " $0}'
会触发语法错误:
awk: line 1: syntax error at or near ,
即使把div2=(sum/$2)改成和div1相同的表达式,错误依然存在。
原因分析
你之前的命令能运行,是因为Awk将sum=($1+$2), div1=(sum/$1)视为序列模式——逗号是Awk的序列运算符,它会依次执行前后两个表达式,最终根据整个序列的结果(最后一个表达式的值)判断是否执行动作块。但Awk的序列运算符只能连接两个表达式,无法用连续逗号连接三个及以上的表达式,这就是添加第三个变量后报错的核心原因。
另外,把变量赋值放在模式区域本身就不符合Awk的设计意图:模式区域的作用是筛选需要处理的行,变量赋值、计算这类逻辑应该放在动作块中。
解决方法
将所有变量赋值移到动作块内部,用分号分隔每个赋值语句,既符合语法规范,代码可读性也更好:
cat data.txt | awk '{sum=$1+$2; div1=sum/$1; div2=sum/$2; print " sum: " sum " div1: " div1 " div2: " div2 " data: " $0}'
执行后会得到预期输出:
sum: 3 div1: 3 div2: 1.5 data: 1 2 sum: 5 div1: 2.5 div2: 1.66667 data: 2 3 sum: 7 div1: 2.33333 div2: 1.75 data: 3 4
如果确实需要在模式区域进行赋值(比如仅在满足某些条件时赋值),可以用分号分隔多个赋值,但这种写法并不推荐,会降低代码可读性。
内容的提问来源于stack exchange,提问作者user1179317
相关产品推荐
相关产品推荐

