一、print 函数
print 是 awk 中最常用的输出函数,它可以将指定的变量、字段或表达式的值输出到标准输出。
1. 基本语法
print [expr1], [expr2], ..., [exprN]
expr1, expr2, ..., exprN:是要输出的表达式,可以是字段(如$1,$2等)或其他变量。- 默认情况下,
print会将表达式的结果按空格分隔输出。
2. 输出字段
在 awk 中,字段是由空格或制表符分隔的文本部分,可以通过 $1, $2 等变量来引用这些字段。例如:
echo "Hello World" | awk '{ print $1, $2 }'
输出结果:
Hello World
在上面的例子中,$1 和 $2 分别代表输入文本中的第一个和第二个字段,print 函数将它们按空格分隔打印出来。
3. 使用 print 进行字符串拼接
虽然 print 默认会将表达式间用空格分隔,但我们可以通过在表达式中加入字符串运算符来拼接字符串。
echo "John 25" | awk '{ print $1 " is " $2 " years old" }'
输出结果:
John is 25 years old
在上面的示例中,$1 和 $2 被拼接成一个完整的句子。注意,字符串拼接时不需要使用显式的运算符(如 +)。只需要通过将字符串和字段或其他字符串直接写在一起,awk 会自动将它们连接。
4. 使用 print 输出换行符
print 默认在每次输出后会自动加上一个换行符。如果我们不希望输出换行符,可以使用 ORS(Output Record Separator)来控制。
echo "apple banana cherry" | awk '{ print $1; print $2; print $3 }'
输出结果:
apple
banana
cherry
若想避免换行,可以修改 ORS:
echo "apple banana cherry" | awk 'BEGIN { ORS=" " } { print $1; print $2; print $3 }'
输出结果:
apple banana cherry
5. 易混易错辨析:print、print x 和 print $0
在 awk 中,print、print x 和 print $0 都是输出命令,但它们的含义有所不同:
-
print
当使用print时,awk默认会打印当前记录的整个内容,即打印整行,等同于print $0。这种写法通常用于简单的输出当前行的所有字段。示例:
awk '{print}' file这会打印文件中的每一行。
-
print x
这里的x代表一个未定义的变量。处理未定义变量时,awk会默认将其值视为一个空字符串或者数字 0。0 是一个常量,它会被直接输出,而不是打印整行或字段。示例:
awk '{print xxoo}' file这会在每一行的输出中打印数字
0。 -
print $0
print $0会打印当前行的所有内容(即awk默认的行为)。$0表示当前行的完整文本,所以这个命令与print的行为相同。示例:
awk '{print $0}' file这会打印文件中的每一行,和
print等价。
二、printf 函数
printf 函数是一个格式化输出函数,它与 C 语言中的 printf 类似,可以让我们更精细地控制输出格式。相比于 print,printf 提供了更多的选项来指定字段的宽度、对齐方式、精度等。
1. 基本语法
printf format, expr1, expr2, ..., exprN
format:指定输出格式的字符串,类似于 C 语言中的格式字符串。expr1, expr2, ..., exprN:要输出的表达式。
与 print 不同的是,printf 结尾不会自动输出换行符。
2. 格式化字符串
printf 的一个重要特性是可以指定输出格式。常见的格式控制符包括:
%s:字符串%d:整数%f:浮动小数%x:十六进制整数%g:最简洁的浮动小数格式
例如,打印一个整数和浮动小数:
echo "3.14159 42" | awk '{ printf "Pi is %.2f, and the answer is %d\n", $1, $2 }'
输出结果:
Pi is 3.14, and the answer is 42
3. 使用 printf 控制输出宽度与对齐
printf 还支持对输出的宽度、对齐方式进行控制。我们可以指定输出字段的最小宽度,awk 会根据需要在字段内容前后填充空格来满足宽度要求。
%10s:输出宽度为 10 的字符串,默认右对齐。%-10s:输出宽度为 10 的字符串,左对齐。
例如:
echo "apple banana cherry" | awk '{ printf "%-10s %-10s %-10s\n", $1, $2, $3 }'
输出结果:
apple banana cherry
在这个例子中,%-10s 表示每个字段占据 10 个字符的宽度,且左对齐。
4. 字符串拼接与格式化输出
printf 还支持将字符串拼接并格式化输出。比如,打印一个拼接后的字符串并控制格式:
echo "John 25" | awk '{ printf "%s is %d years old\n", $1, $2 }'
输出结果:
John is 25 years old
此例中,我们通过 %s 和 %d 控制字符串和数字的输出格式。
三、print vs printf
print更适合快速的输出,尤其是对于简单的文本打印,print是一个简洁而有效的选择。printf更强大,适用于需要复杂格式化输出的场景,比如表格、对齐和数值格式化。
使用场景对比
- 简单输出:如果只需要输出文本或字段,不关心格式,可以使用
print。 - 复杂格式输出:如果需要控制输出的精确格式,尤其是在数值、日期、表格等方面,使用
printf更为合适。
四、总结
awk 中的 print 和 printf 都是非常有用的输出函数,但它们各自有不同的特点。print 适合于快速的输出,而 printf 提供了更多的格式化控制,适用于复杂的输出需求。通过掌握这两个函数的使用,您可以更加灵活地处理和输出文本数据,满足各种格式化输出的需求。
原文 https://blog.csdn.net/2301_79518550/article/details/145267795