AWK中$$1的作用是什么?解析$$1~/^[^0-9]/ {print $$1;}代码疑问
AWK中
$$1的含义与代码片段解析 一、$$1的核心含义
在AWK中:
$n表示当前行的第n个字段(比如$1是第一个字段,$2是第二个字段)。$$1是间接字段引用:先获取当前行第一个字段的值,把这个值当作字段编号,再取出对应编号的字段。举个例子:如果当前行$1的值是3,那$$1就等价于$3;如果$1是"abc"这种非数字,AWK会将其视为无效字段编号,返回空或者直接取$0(整行内容),具体取决于AWK版本。
二、代码片段$$1~/^[^0-9]/ {print $$1;}的功能
这段代码的逻辑是:
- 对每一行,通过
$$1间接获取目标字段; - 判断该目标字段的开头是否不是数字(正则
^[^0-9]的含义:^匹配行首,[^0-9]匹配非数字字符); - 如果满足条件,就打印这个目标字段。
三、结合你的测试输入分析
你的测试输入如下:
std
1 ABC1724 2018 Wroclaw
3 ABC1724 2018 Wroclaw
2 ABC1724 2018 Wroclaw
逐行解析执行逻辑:
- 第一行
std:$1的值是"std",AWK无法将其解析为有效字段编号,此时$$1等价于$0(整行内容std)。std开头是非数字,满足条件,会打印std。 - 第二行
1 ABC1724 2018 Wroclaw:$1的值是"1",$$1等价于$1(即"1")。1开头是数字,不满足条件,不打印。 - 第三行
3 ABC1724 2018 Wroclaw:$1的值是"3",$$1等价于$3(即"2018")。2018开头是数字,不满足条件,不打印。 - 第四行
2 ABC1724 2018 Wroclaw:$1的值是"2",$$1等价于$2(即"ABC1724")。ABC1724开头是非数字,满足条件,会打印ABC1724。
四、测试时可能遇到的问题
如果测试后没看到预期输出,大概率是shell转义问题:在shell中,$$是特殊变量,表示当前shell的进程ID。如果直接运行awk $$1~/^[^0-9]/ {print $$1;},shell会先把$$替换成进程ID,导致AWK实际执行的代码完全偏离预期。
正确的运行方式是用单引号包裹AWK脚本,避免shell解析特殊变量:
awk '$$1~/^[^0-9]/ {print $$1;}' 你的输入文件
内容的提问来源于stack exchange,提问作者POWER
相关产品推荐
相关产品推荐

