Awk 输出(Print & Printf)

Awk 提供了 printprintf 两种输出方式:

  • print:适用于简单的输出
  • printf:格式化输出(类似 C 语言)

1. print 语句

基本用法

语法 说明
print 输出当前行(默认 $0
print 变量 输出变量的值
print 变量1, 变量2, ... 多个参数输出(用 OFS 作为分隔符)
print 变量1 变量2 多个参数直接拼接(无分隔符)

示例 1:输出整行

{ print }  # 等价于 print $0

示例 2:输出某个字段

{ print $1 }  # 只输出第一列

示例 3:输出多个字段

{ print $1, $2 }  # 用默认空格分隔

输入

Alice 25
Bob 30
Charlie 28

输出

Alice 25
Bob 30
Charlie 28

示例 4:改变 OFS(输出字段分隔符)

BEGIN { OFS=" | " }
{ print $1, $2 }

输出

Alice | 25
Bob | 30
Charlie | 28

2. printf 语句

语法

printf("<格式字符串>", 参数1, 参数2, ...)
  • 格式字符串包含普通字符和格式占位符(如 %d, %s, %f)。
  • printf 不会自动换行,需要手动加 \n

3. printf 格式化占位符

格式代码 说明 示例
%d 整数(十进制) printf("%d", 35)35
%o 整数(八进制) printf("%o", 35)43
%x 整数(十六进制) printf("%x", 35)23
%c 字符(ASCII 码转换) printf("%c", 65)A
%s 字符串 printf("%s", "hello")hello
%e 科学计数法 printf("%e", 3.1415)3.141500e+00
%f 浮点数 printf("%f", 3.1415)3.141500
%g 自动选择 %e%f printf("%g", 3.1415)3.1415

4. printf 示例

4.1 格式化整数

BEGIN {
    x = 35
    printf("x = %d decimal, %x hex, %o octal.\n", x, x, x)
}

输出

x = 35 decimal, 23 hex, 43 octal.

4.2 格式化字符串

BEGIN {
    name = "Alice"
    printf("Hello, %s!\n", name)
}

输出

Hello, Alice!

4.3 格式化浮点数

BEGIN {
    x = 3.14159
    printf("x = %f\n", x)
}

输出

x = 3.141590

5. 指定宽度和对齐

格式 说明 示例 输出
%5d 右对齐,宽度 5 printf("[%5d]", 35) [ 35]
%-5d 左对齐,宽度 5 printf("[%-5d]", 35) [35 ]
%08d 宽度 8,前导 0 printf("[%08d]", 35) [00000035]

示例

BEGIN {
    x = 312
    printf("[%5d]\n", x)   # [  312]
    printf("[%-5d]\n", x)  # [312  ]
    printf("[%08d]\n", x)  # [00000312]
}

6. 格式化浮点数

格式 说明 示例 输出
%5.2f 总宽度 5,小数点后 2 位 printf("[%5.2f]", 3.14159) [ 3.14]
%-5.2f 左对齐,宽度 5,小数 2 位 printf("[%-5.2f]", 3.14159) [3.14 ]
%08.2f 宽度 8,前导 0 printf("[%08.2f]", 3.14159) [00003.14]

示例

BEGIN {
    x = 251.67309
    printf("[%5.2f]\n", x)     # [251.67]
    printf("[%10.3f]\n", x)    # [   251.673]
    printf("[%-10.3f]\n", x)   # [251.673   ]
    printf("[%010.3f]\n", x)   # [000251.673]
}

7. printf 实战示例

7.1 打印表格

BEGIN {
    printf("%-10s %5s %10s\n", "Name", "Age", "Salary")
    printf("%-10s %5d %10.2f\n", "Alice", 25, 5000.50)
    printf("%-10s %5d %10.2f\n", "Bob", 30, 6500.75)
    printf("%-10s %5d %10.2f\n", "Charlie", 28, 7200.00)
}

输出

Name         Age     Salary
Alice        25   5000.50
Bob          30   6500.75
Charlie      28   7200.00

7.2 对齐列

{
    printf("%-10s %10s %10.2f\n", $1, $2, $3)
}

输入

Alice Manager 5000.5
Bob Engineer 6500.75
Charlie HR 7200.00

输出

Alice        Manager    5000.50
Bob          Engineer   6500.75
Charlie      HR        7200.00

总结

语法 说明
print $0 输出整行
print $1, $2 输出多个字段(空格分隔)
OFS=","; print $1, $2 改变字段分隔符
printf("%d", x) 格式化整数
printf("%5.2f", x) 格式化浮点数
printf("%-10s", x) 左对齐字符串

练习

  1. 格式化整数
BEGIN { printf("Total: %08d\n", 123) }

输出

Total: 00000123
  1. 输出对齐列表
BEGIN {
    printf("%-12s %5s %10s\n", "Name", "Age", "Salary")
    printf("%-12s %5d %10.2f\n", "Alice", 25, 5000.50)
}

输出

Name          Age     Salary
Alice         25   5000.50

下一章,我们将学习 Awk 的文件处理(File Processing) 🚀

Last modified: Thursday, 30 January 2025, 1:20 AM