格式化列印: printf
在很多时候,我们可能需要将自己的资料给他格式化输出的! 举例来说,考试卷分数的输出,姓名与科目及分数之间,总是可以稍微作个比较漂亮的版面配置吧? 例如我想要输出底下的样式:
Name Chinese English Math Average
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33
上表的资料主要分成五个栏位,各个栏位之间可使用 tab 或空白键进行分隔。 请将上表的资料转存成为 printf.txt 档名,等一下我们会利用这个档案来进行几个小练习的。 因为每个栏位的原始资料长度其实并非是如此固定的 (Chinese 长度就是比 Name 要多), 而我就是想要如此表示出这些资料,此时,就得需要列印格式管理员 printf 的帮忙了! printf 可以帮我们将资料输出的结果格式化,而且而支援一些特殊的字符~底下我们就来看看!
[root@www ~]# printf '列印格式' 实际内容
选项与参数:
关于格式方面的几个特殊样式:
a 警告声音输出
倒退键(backspace)
f 清除荧幕 (form feed)
输出新的一行
亦即 Enter 按键
水平的 [tab] 按键
v 垂直的 [tab] 按键
xNN NN 为两位数的数字,可以转换数字成为字元。
关于 C 程式语言内,常见的变数格式
%ns 那个 n 是数字, s 代表 string ,亦即多少个字元;
%ni 那个 n 是数字, i 代表 integer ,亦即多少整数位数;
%N.nf 那个 n 与 N 都是数字, f 代表 floating (浮点),如果有小数位数,
假设我共要十个位数,但小数点有两位,即为 %10.2f 啰!
接下来我们来进行几个常见的练习。假设所有的资料都是一般文字 (这也是最常见的状态),因此最常用来分隔资料的符号就是 [Tab] 啦!因为 [Tab] 按键可以将资料作个整齐的排列!那么如何利用 printf 呢?参考底下这个范例:
范例一:将刚刚上头资料的档案 (printf.txt) 内容仅列出姓名与成绩:(用 [tab] 分隔)
[root@www ~]# printf '%s %s %s %s %s
' $(cat printf.txt)
Name Chinese English Math Average
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33
由于 printf 并不是管线命令,因此我们得要透过类似上面的功能,将档案内容先提出来给 printf 作为后续的资料才行。 如上所示,我们将每个资料都以 [tab] 作为分隔,但是由于 Chinese 长度太长,导致 English 中间多了一个 [tab] 来将资料排列整齐!啊~结果就看到资料对齐结果的差异了!
另外,在 printf 后续的那一段格式中,%s 代表一个不固定长度的字串,而字串与字串中间就以 这个 [tab] 分隔符号来处理!你要记得的是,由于 与 %s 中间还有空格,因此每个字串间会有一个 [tab] 与一个空白键的分隔喔!
既然每个栏位的长度不固定会造成上述的困扰,那我将每个栏位固定就好啦!没错没错!这样想非常好! 所以我们就将资料给他进行固定栏位长度的设计吧!
范例二:将上述资料关于第二行以后,分别以字串、整数、小数点来显示:
[root@www ~]# printf '%10s %5i %5i %5i %8.2f
' $(cat printf.txt |
> grep -v Name)
DmTsai 80 60 92 77.33
VBird 75 55 80 70.00
Ken 60 90 70 73.33
上面这一串格式想必您看得很辛苦!没关系!一个一个来解释!上面的格式共分为五个栏位, %10s 代表的是一个长度为 10 个字元的字串栏位,%5i 代表的是长度为 5 个字元的数字栏位,至于那个 %8.2f 则代表长度为 8 个字元的具有小数点的栏位,其中小数点有两个字元宽度。我们可以使用底下的说明来介绍 %8.2f 的意义:
字元宽度: 12345678
%8.2f意义:00000.00
如上所述,全部的宽度仅有 8 个字元,整数部分占有 5 个字元,小数点本身 (.) 占一位,小数点下的位数则有两位。 这种格式经常使用于数值程式的设计中!这样了解乎?自己试看看如果要将小数点位数变成 1 位又该如何处理?
printf 除了可以格式化处理之外,他还可以依据 ASCII 的数字与图形对应来显示资料喔(注3)! 举例来说 16 进位的 45 可以得到什么 ASCII 的显示图 (其实是字元啦)?
范例三:列出 16 进位数值 45 代表的字元为何?
[root@www ~]# printf 'x45
'
E
# 这东西也很好玩~他可以将数值转换成为字元,如果你会写 script 的话,
# 可以自行测试一下,由 20~80 之间的数值代表的字元是啥喔! ^_^
printf 的使用相当的广泛喔!包括等一下后面会提到的 awk 以及在 C 程式语言当中使用的荧幕输出, 都是利用 printf 呢!鸟哥这里也只是列出一些可能会用到的格式而已.