5 打印输出

5.1 使用print语句

使用print比较简单,每个打印的元素用逗号分割即可。

[root@centos74 test]$ awk '{print $1,$2}' mail-list
Amelia 555-5553
Anthony 555-3412
Becky 555-7685
Bill 555-1675
Broderick 555-0542
Camilla 555-2912
Fabius 555-1234
Julie 555-6699
Martin 555-6480
Samuel 555-3430
Jean-Paul 555-2127

5.2 输出分割符号

默认的输出字段分割符号是空格, 默认的输出记录分隔符是回车。

[root@centos74 test]$ awk 'BEGIN{OFS=":" ; ORS="\n\n"}{print $1,$2}' mail-list
Amelia:555-5553

Anthony:555-3412

Becky:555-7685

Bill:555-1675

Broderick:555-0542

Camilla:555-2912

Fabius:555-1234

Julie:555-6699

Martin:555-6480

Samuel:555-3430

Jean-Paul:555-2127

控制输出分割符号,可以直接修改OFS(output field seprate),ORS(output field seprate)

5.3 使用printf去输出

print打印起来有些格式控制上不是太灵活的。 这个时候就需要printf闪亮登场了。

使用前有必要先给控制符号说下。 基本上和c语言的printf风格一样的。 学起来也是比较轻松的。

%c      单个字符
%d      数字
%e      科学计数表示
%f      浮点数
%g      只能使用科学技术和通用技术表示法
%%      打印%
$s      字符串
-       左边对齐
+       正负数符号
0       控制前导0
width   控制有效位数
.       控制浮点精度

使用样例

[root@centos74 test]$ echo "15" | awk '{printf "%d\n",$0 }'
15
[root@centos74 test]$ echo "15" | awk '{printf "%3d\n",$0 }'
15
[root@centos74 test]$ echo "15" | awk '{printf "%+3d\n",$0 }'
+15
[root@centos74 test]$ echo "15.1" | awk '{printf "%-3.2f\n",$0 }'
15.10
[root@centos74 test]$ echo "15.1" | awk '{printf ("%-3.2f\n",$0) }'
15.10

上面的最后一个样例和上面的有所不同,使用了类似c的函数写法。 我个人是比较倾向与这个写法的,看着比较舒服。

5.3 重定向print的结果和printf的结果

一个文件中有多个属性列,但是我指向提取部分列数据, 且单独分割到一个文件中,可以考虑如下方法。

[root@centos74 test]$ awk '{ print $2 > "phone-list"
print $1 > "name-list" }' mail-list
[root@centos74 test]$ cat phone-list
555-5553
555-3412
555-7685
555-1675
555-0542
555-2912
555-1234
555-6699
555-6480
555-3430
555-2127
[root@centos74 test]$ cat name-list
Amelia
Anthony
Becky
Bill
Broderick
Camilla
Fabius
Julie
Martin
Samuel
Jean-Paul

有时候我们使用awk提取完数据,需要借助bash去完成后续的操作。可以参考如下:

[root@centos74 test]$ awk '{print $1 > "name.unsorted"
> command = "sort -r >name.sorted"
> print $1 | command }' mail-list

[root@centos74 test]$ awk '{print $1 > "name.unsorted"
> print $1 | command }' mail-list |  sort -r >name.sorted

第一种方法用一个变量去存储要重定向的命令。将结果管道给重定向的命令即可。第二种就是看起来相对更好理解一些。 我习惯第二种方法。

5.4 指定print的输出

我们使用print,printf的时候是可以指定输出位置的, 默认是标准输出的。

[root@centos74 test]$ awk 'BEGIN{prinf "aaa" > "a.txt"}'