格式化打印printf


文件的格式化与相关处理

回到顶部

接下来让我们来将文件进行一些简单的编排吧!底下这些动作可以将你的信息进行排版的动作, 不 需要重新以 vim 去编辑,通过数据流重定向配合底下介绍的 printf 功能,以及 awk 命令, 就可以 让你的信息以你想要的模样来输出了!

格式化打印printf

回到顶部

在很多时候,我们可能需要将自己的数据给他格式化输出的! 举例来说,考试卷分数的输出,姓名 与科目及分数之间,总是可以稍微作个比较漂亮的版面配置吧? 例如我想要输出底下的样式:

              Name Chinese English Math Average
              peter 80 60 92 77.33
              INITroot 75 55 80 70.00
              Ken 60 90 70 73.33
            
上表的数据主要分成五个字段,各个字段之间可使用 tab 或空格键进行分隔。 请将上表的资料转存 成为 printf.txt 文件名,等一下我们会利用这个文件来进行几个小练习的。 因为每个字段的原始数据长 度其实并非是如此固定的 (Chinese 长度就是比 Name 要多), 而我就是想要如此表示出这些数据, 此时,就得需要打印格式管理员 printf 的帮忙了! printf 可以帮我们将资料输出的结果格式化,而 且而支持一些特殊的字符~底下我们就来看看!
              [peter@study ~]$ printf '打印格式' 实际内容
            
选项与参数: 关于格式方面的几个特殊样式:
\a 警告声音输出
\b 退格键(backspace)
\f 清除屏幕 (form feed)
\n 输出新的一行
\r 亦即 Enter 按键
\t 水平的 [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] 分隔)
              [peter@study ~]$ printf '%s\t %s\t %s\t %s\t %s\t \n' $(cat printf.txt)
              Name Chinese English Math Average
              peter 80 60 92 77.33
              INITroot 75 55 80 70.00
              Ken 60 90 70 73.33
            
由于 printf 并不是管道命令,因此我们得要通过类似上面的功能,将文件内容先提出来给 printf 作 为后续的资料才行。 如上所示,我们将每个数据都以 [tab] 作为分隔,但是由于 Chinese 长度太长, 导致 English 中间多了一个 [tab] 来将资料排列整齐!啊~结果就看到资料对齐结果的差异了!
另外,在 printf 后续的那一段格式中,%s 代表一个不固定长度的字符串,而字符串与字符串中间就 以 \t 这个 [tab] 分隔符来处理!你要记得的是,由于 \t 与 %s 中间还有空格,因此每个字符串间 会有一个 [tab] 与一个空格键的分隔喔!
既然每个字段的长度不固定会造成上述的困扰,那我将每个字段固定就好啦!没错没错!这样想非常 好! 所以我们就将数据给他进行固定字段长度的设计吧!
范例二:将上述资料关于第二行以后,分别以字符串、整数、小数点来显示:
              [peter@study ~]$ printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt | grep -v Name)
              peter 80 60 92 77.33
              INITroot 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 代表的字符为何?
[peter@study ~]$ printf '\x45\n'
E
# 这东西也很好玩~他可以将数值转换成为字符,如果你会写 script 的话,
# 可以自行测试一下,由 20~80 之间的数值代表的字符是啥喔! ^_^
printf 的使用相当的广泛喔!包括等一下后面会提到的 awk 以及在 C 程序语言当中使用的屏幕输出, 都是利用 printf 呢!这里也只是列出一些可能会用到的格式而已,有兴趣的话,可以自行多作 一些测试与练习喔! ^_^
Tips
打印格式化这个 printf 命令,乍看之下好像也没有什么很重要的~ 不过,如果你需要
自行撰写一些软件,需要将一些数据在屏幕上头漂漂亮亮的输出的话, 那么 printf 可也是一个很棒的工具喔!

相关阅读:
本文由initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读