全部博文(26)
分类: LINUX
2014-02-04 21:42:43
摘自:[美]Harley Hahn:Unix & Linux大学教程
十三、过滤器:统计和格式化
(1)创建行号:nl
nl在文本中插入行号,行号总是临时的,除非保存。命令语法为
nl [-v start] [-i increment] [-b a] [-n ln|rn|rz] [file…]
其中start是起始号,increment是增量,file是文件名
-v选项改变起始编号,-i选项改变增量
默认情况下,nl不对空行编号。为了强制编号,使用-b(body number,正文编号)选项,后面跟字母a(all,所有行)
nl -b a file
-n(number format)选项,后面跟一个代码控制数字格式:
ln=左对齐,没有前导0
rn=右对齐,没有前导0
rz=右对齐,有前导0
(2)统计行、单词和字符数量:wc
wc [-clLw] [file…]
默认情况下,wc的输出包含3个数字:数据中的行数、单词数和字符数。行(Line)、单词(Word)和字符(Charater),LWC, “Look at woman carefully”.
其中,“字符”就是字母、数字、标点符号、空格、制表符或新行字符;“单词”就是一串连续的字符,用空格、制表符或新行字符分隔;“行”就是以新行字符结尾的一串字符。
-l(统计行) –c(统计字符) -w(统计单词)
对于Linux来说,还有另一个选项-L,显示输入中最长行的长度。
(3)可视化制表符和空格
Vi编辑器 :set list (开) :set nolist (关)
Nano或pico
set whitespace “xy”
其中x是希望表示一个制表符的字符,而y是显示一个空格的字符。
(4)将制表符转换为空格:expand
命令语法为 expand [-i] [-t size|-t list] [file...]
其中size是固定宽度制表符的大小,list是制表位列表,而file是文件名。
expand使用Unix的默认设置,假定制表符之间有8个位置。使用-t(-tab stop,制表位)选项可以改变该设置。-t选项有两种使用方式,第一种,如果所有的制表位都是相同间距,则可以在-t后加一个数字。
-t选项还有一种使用方式。如果希望制表位位于特定的位置上,则可以指定一串用逗号分开的多个数字。在该列表中,编号从0开始。
当希望转换制表符时,还有一种选项可使用,只能在行的开头使用。在这种情况下,使用的就是-i(initial,初始)选项,例如:
expand -i -t 4 data > data-new
(5)将空格转换为制表符:unexpand
语法为 unexpand [-a] [-t size|-t list] [file...]
默认只替换行首的空格,使用-a(all,全部)替换全部。
(6)格式化行:fold
fold程序处理行,fmt程序处理段落,而pr程序处理页面和列。
fold程序可根据指示瞬间分隔行,语法为:
fold [-s] [-w width] [file...] (width是新行最大宽度)
默认情况下,fold程序在位置80处分隔行。因为在20世纪70年代,当开发Unix时,人们认为80是关于文本行的约整数。为了改变这个宽度,可使用-w(width,宽度)选项,后接希望的最大行长度。
-s选项告诉fold不分隔单词。
(7)格式化段落:fmt
fmt的目标是将段落中的各行连接在一起,从而使段落尽可能短小和紧凑,而且不改变内容和空白符。语法为:
fmt [-su] [-w width] [file...]
其中width是行的最大宽度,file是文件名称。
当fmt读取文本时,它假定段落由空行分隔。因此,一个“段落”就是一个或多个连续的文本行,不含空行。fmt按以下规则读取并格式化段落。
行宽:使每行尽可能长,但不超过指定长度。默认为75,可用-w选项
句子:尽可能在句末分隔行
空白符:保留单词以及空行之间的所有缩进、空格。使用-u选项修改
制表符:读取文件时将所有制表符转换成空格,并在最后的输出中的合适位置插入新的制表符。
-u(uniform spacing,统一间距)选项告诉fmt减少空格,从而使单词间最多有一个空格,句末最多有两个空格,这一样式为“法式间距”。
-s(split only,仅拆分)选项告诉fmt拆分升迁,但不连接短行。
(8)pr
pr的主要功能是按页格式化文本,以使其适合于打印。语法为:
pr [-dt] [+ begin[:end]] [-h text] [-l n] [-o margin] [-W width] [file...]
其中begin是需要格式化的第一页,end是需要格式化的最后一面,text是标题中间的文本,n是每页的行数,margin是左边缘的大小,width是输出的宽度,file是文件。
通常pr作为管道线的一部分,以使在将文本发送给打印机前对文本进行格式化。例:
cat data1 data2 data3 | pr | lpr
此命令将3个文件组合后输出发送给pr格式化,再发送给lpr进行打印(Unix中文件打印的两个基本程序是lp和lpr)。
默认情况下,pr通过在顶端插入一个标题,左边插入一个边缘,底部插入一个页尾来格式化页面。标题和页尾各占5行。左边缘和页尾只用于间距,所以它们是空白的。但是标题在其中间行包含信息:文件上一次修改日期和时间、文件的名称以及页号。
pr程序假定一页只有66行,因为老式打印机使用11英寸的纸,每英寸打印6行。标题和页尾各占5行,则每页剩下56行用于单倍选中的文本。
几乎所有暑假,当使用pr格式化页并进行打印时,默认设置已能满足需求。但是如果有需要,也可以使用几个选项修改设置。最常用的选项是-d,该选项告诉pr使用双倍行距文本。
如果希望控制格式化哪些页,可使用 pr +begin[:end],例:
fmt essay | pr -d +3:6 | lpr
如果希望指定标题中间的文本,可使用-h选项,例:
fmt essay | pr -h “My Essay By Harley” | lpr
为了改变每页的总行数,可以使用-l,后面加一个数字。
为了消除标题,可使用-t选项。
默认情况下,pr不插入左边缘,因为极为可能打印机被设置成自动创建边缘。但是,如果希望自己添加一个额外的边缘,则可以使用-o(offset,偏移)选项,后面跟额外边缘的空格数量。另外,还可以使用-W选项,改变输出的宽度(默认为72字符)。当使用-W选项时,太长的行会被截断。因此一定要小心不要丢失文本。
将文本文件发送pr之前使用fold或者fmt对文本进行预处理时,最好明确指定希望的准确行宽,因为这3个程序使用不同的默认值:fmt-80字符/行,fmt-75字符/行,pr-72字符/行
pr还可以按列格式化文本,输入数据来源于单个或多个文件。语法为:
pr [-mt] [-columns] [-l lines] [-W width] [file...]
其中column是输出列的数量,lines是每页的行数,width是输出的宽度,file是文件名。例:
fmt -w 35 article | pr -z -l 48 > article-columns
默认情况下,pr使用制表符对齐各列
pr还可以将多个文件分别格式化为单独的列。使用-m (merge,合并)选项,pr将在单独的列中输出各个文件。
通过这种方式合并多个文件时,通常使用-t选项移除标题。
pr –mt f1 f2 f3 > formatted-articles