在 awk 中用 substr() 截取特定列子字符串,需先定位目标列(如 $4),再调用 substr($4,2,3) 从第2字符取3个字符;支持条件过滤、字段赋值修改及越界防护。

在 awk 中用 substr() 截取特定列的子字符串,关键是先定位目标列(比如第3列),再对它的值调用 substr(string, start, length) 函数。它不修改原字段,只返回新子串,需显式赋值或用于输出。
基本语法:对某列直接截取
假设以空格分隔,想取第4列从第2个字符开始的3个字符:
awk '{print substr($4, 2, 3)}' file.txt说明:
• $4 是第四列的完整内容;
• substr($4, 2, 3) 表示从第2个字符起,取3个字符(下标从1开始);
• 若长度省略(如 substr($4, 5)),则截取从第5位到末尾。
结合条件:只处理满足要求的列
例如:仅当第2列长度 ≥ 6 时,截取其前4个字符:
awk 'length($2) >= 6 {print substr($2, 1, 4)}' file.txt说明:
• length($2) 获取第二列字符数;
• 条件成立才执行花括号内动作;
• 可嵌套使用,如 substr(tolower($3), 1, 2) 先转小写再截取。
修改原字段并输出整行
若想把第5列替换成它的子串,再打印整行:
awk '{$5 = substr($5, 3, 5); print}' file.txt说明:
• $5 = ... 是赋值操作,会覆盖原第5列内容;
• 多个字段可连续处理,如 $2 = substr($2,1,1); $3 = substr($3, -2)(注意:awk 不支持负索引,-2 无效,要取后2位得用 substr($3, length($3)-1));
• 修改字段后,$0 自动更新,print 输出整行即含新值。
安全截取:避免越界和空字段
防止 substr() 对空字段或起始位置越界报错(实际 awk 通常静默处理,但逻辑易出错):
awk '$7 != "" && length($7) >= 5 {print substr($7, 1, 5)}' file.txt说明:
• 先判断字段非空且足够长;
• 或用三元运算简化:print ($8 ~ /^.{4,}$/) ? substr($8,1,4) : "N/A";
• 注意:substr 起始位置 ≤ 0 时,awk 视为 1;超出字符串长度时,自动截断到末尾,不会报错。











