AWK变量数量上限?为何第一条语句可行第二条报错?
解决AWK脚本的语法错误问题
咱们先拆解下你遇到的问题:第一条命令能运行是巧合,第二条报错是因为误用了AWK的逗号语法——它可不是用来分隔赋值语句的!
为什么第一条能跑?
你写的第一条命令:
awk 'f1=substr($1,0,9), f2=substr($3,0,9){if(f1==f2)print $1,$2,$3,$4}' file
这里的逗号是AWK的范围模式分隔符,意思是匹配「从f1=substr(...)为真的行开始,到f2=substr(...)为真的行结束」的所有行,然后在这些行里执行后面的if判断。因为substr返回非空字符串时会被视为真,所以只要$1和$3长度够,这个范围就会包含所有行,再加上if(f1==f2)的过滤,碰巧得到了你想要的结果,但这完全是依赖语法副作用的歪打正着。
第二条为什么报错?
当你加了第三个逗号分隔的f3=substr($1,5,3),AWK的语法根本不支持三个部分的范围模式,直接触发语法错误——它不知道怎么解析三个逗号分隔的表达式,所以就报错了。
正确的写法
要实现「给多个变量赋值,再判断条件」的逻辑,应该把赋值语句放在动作块里,或者用分号分隔(分号才是AWK里的语句分隔符):
写法1:推荐,赋值和逻辑都在动作块里
awk '{ f1 = substr($1, 1, 9) # 注意:AWK的substr起始索引是1,0会被自动转为1,建议写1更规范 f2 = substr($3, 1, 9) f3 = substr($1, 5, 3) if (f1 == f2) { print $1, $2, $3, $4 } }' file
写法2:把赋值放在模式部分(不推荐,但可以运行)
如果一定要在模式里做赋值,用分号分隔表达式,最后跟上判断条件:
awk 'f1=substr($1,1,9); f2=substr($3,1,9); f3=substr($1,5,3); f1==f2 {print $1,$2,$3,$4}' file
额外小提示
AWK的substr函数第一个参数是字符串,第二个是起始位置(从1开始),第三个是长度。你之前写的substr($1,0,9)虽然能运行,但不符合函数定义,建议改成substr($1,1,9),避免后续踩坑。
内容的提问来源于stack exchange,提问作者user3746195
相关产品推荐
相关产品推荐

