第5.6节:awk字符串运算
1 第5.6节:awk字符串运算
1.1 堆叠式拼接字符串
字符串操作仅有**连接(拼接)**这一种。它没有专门的运算符来表示,而是通过将表达式彼此相邻书写(不加运算符)来实现拼接。例如:
$ awk '{ print "Field number one: " $1 }' mail-list
-| Field number one: Amelia
-| Field number one: Anthony
...
要是字符串常量里 :
后面的空格没了,整行就会连在一起。比如:
$ awk '{ print "Field number one:" $1 }' mail-list
-| Field number one:Amelia
-| Field number one:Anthony
🕮说明:字符串参数和参数之间至少有1个空格,否则变量名就解析失败了!另外一种可行的实践是将待拼接的几个字符串变量使用()进行包围。
由于字符串拼接没有显式的运算符,通常需要使用圆括号将待拼接的项括起来,以确保拼接在合适的时机进行。例如,你可能期望下面的代码片段拼接 file
和 name
:
file = "file"
name = "name"
print "something meaningful" > file name
在某些版本的 Unix awk 中,这会产生语法错误。必须按如下方式编写:
print "something meaningful" > (file name)
除了最常见的场景(比如在 =
的右侧),在拼接操作周围都应该使用圆括号。要留意用于字符串拼接的表达式类型,具体来说,awk 语言中未定义用于拼接的表达式的求值顺序。考虑以下示例:
BEGIN {a = "don't"print (a " " (a = "panic"))
}
无法确定对 a
的第二次赋值是在为生成拼接值而获取 a
的值之前还是之后进行。结果可能是 don't panic
,也可能是 panic panic
。
当拼接与其他运算符混合使用时,其优先级往往有悖直觉。考虑以下示例:
$ awk 'BEGIN { print -12 " " -24 }'
-| -12-24
这“显然”是要拼接 -12
、一个空格和 -24
。但空格哪儿去了呢?答案在于运算符优先级和 awk 自动转换规则的共同作用。要得到期望的结果,应按如下方式编写程序:
$ awk 'BEGIN { print -12 " " (-24) }'
-| -12 -24
这样做会迫使 awk 将 -24
中的 -
视为一元运算符。否则,解析过程如下:
-12 (" " - 24)
⇒ -12 (0 - 24)
⇒ -12 (-24)
⇒ -12-24
如前所述,当拼接与其他运算符混合使用时,要加上圆括号。否则,你永远无法完全确定会得到什么结果 。
1.2 使用sprintf
函数拼接字符串
使用sprintf
函数拼接字符串会更清晰,也是本文作者更乐于使用的一种方式。
$ awk '{print sprintf("Line %s: %s", FNR, $0)}' sample1.txt
Line 1: sample
Line 2: 1
Line 3: 12
Line 4: 123
Line 5: 456
Line 6: 789abc
Line 7: 012345678
Line 8: end
作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.