在AWK中,变量和数组是其强大功能的基础部分。AWK支持两种类型的数组:索引数组(类似于C语言中的整数索引数组)和关联数组(也称为哈希表或字典,其中的键可以是字符串)。以下是一些关于AWK中复杂用法的变量与数组的例子:
变量:
定义和使用变量:
BEGIN { var = "Hello, World!" print var }
在BEGIN块中定义了一个变量
var
并赋值,然后打印它的内容。动态变量名:
BEGIN { column_name = "age" value = 30 printf "%s=%d\n", column_name, value vars[column_name] = value # 使用动态变量名创建关联数组元素 } END { print vars["age"] # 输出关联数组中age字段的值 }
数组:
索引数组:
{ array[NR] = $1 # 将每一行的第一个字段存入数组,NR为内置变量,表示当前记录号(即行号) } END { for (i = 1; i <= NR; i++) { print "Record ", i, ": ", array[i] } }
上述代码将每行的第一个字段按行号存入数组,并在END块中遍历输出。
关联数组:
BEGIN { split("apple:1 banana:2 cherry:3", fruits, /:/) # 从字符串创建关联数组 } { if ($1 in fruits) { # 检查字段是否存在于关联数组中 print $1, "has count:", fruits[$1] } }
这里创建了一个关联数组
fruits
,键是水果名称,值是对应的数量。复合操作:
NR == FNR { # 第一个文件处理阶段 names[$1] = $2 # 假设第一列是姓名,第二列是年龄,建立关联数组 next } $1 in names { # 当读取第二个文件时,如果第一列存在于names数组中 print $0, "Age:", names[$1] # 打印当前行及对应的名字对应的年龄 }
上述脚本在处理两个输入文件时,首先用第一个文件的数据填充一个关联数组,然后在处理第二个文件时,查找匹配项并打印附加信息。
遍历关联数组:
END { for (name in names) { # 遍历关联数组的所有键 print "Name:", name, "Age:", names[name] } }
这段代码将在程序结束时遍历并打印出所有存储在关联数组
names
中的姓名及其对应的年龄。
总之,AWK中的变量和数组使得数据处理变得非常灵活,你可以根据需要创建、更新和访问它们来实现复杂的文本处理任务。