18 过滤器:统计和格式化
18.1 创建行号:nl
相关过滤器:wc
功能:在文本中插入行号
语法: nl [-v start] [-i increment] [-b -a] [-n ln | rn | rz] [file...]
使用场景:
1.希望在一些数据中永久插入行号,然后再保存;
2.希望在命令的输出中临时插入行号,以便于理解。
从100开始编号:
nl -v 100 data
从1开始编号,但增量是5:
nl -i 5 data
从100开始编号,但增量是5:
nl -v 100 -i 5 data
从100开始编号,但增量是5,包括空行在内的所有行都编号,数字是右对齐的,而且有前导0:
nl -v 100 -i 5 -b a -n rz data
注:ln:左对齐,没有前导0;rn:右对齐,没有前导0;rz:右对齐,有前导0;
18.2 统计行、单词和字符数量:wc
相关过滤器:nl
语法:
wc [-clLw] [file...]
-c 统计字符 -l 统计行 -w 统计单词 -L 输入中最长行的长度
输出:
默认时,数据中的行数,单词数,字符数。
记忆:
行(line),单词(word),字符(Character),"Look at Women Carefully".
应用:
统计/etc目录中文件的数量: ls /etc | wc -l
说明有多少用户登录当前系统: echo "There are `who | wc -l` userids logged in right now."
18.3 Unix使用制表符的方式
18.4 可视化制表符和空格
expand程序将制表符变成空格
unexpand程序将空格变成制表符
使用wc -c 可以查看上述两程序是否工作正常
18.5 将制表符转换成空格
相关过滤器:unexpand
语法:expand [-i] [-t size | -t list] [file...]
size是固定宽度制表符的大小(默认为8),list是制表位列表,而file是文件名。
例:
expand -t 4 data > data-new (-t,设置制表符间隔)
expand -t 7,15,21,56 data > data-new (-t,设置制表符位置)
expand -i -t -4 data > data-new (-i,只转换行开头的制表符)
expand -t 4 data | cut -c 1-15 | sort
18.6 将空格转换成制表符:unexpand
相关过滤器:expand
语法:
unexpand [-a] [-t size | -t list] [file...]
unexpand是expand的逆过程。
两者的重要区别:默认情况下,unexpand程序只替换行开头的空格。使用-a(all)选项,则可以替换所有的空格。
18.7 格式化行
相关过滤器:fmt、pr
3者关系:fold处理行,fmt处理段落,pr处理页面和列
语法:
fold [-s] [-w width] [file...]
width是新行的最大宽度
默认:fold在80处分隔行。
例:
将一文件重新格式化为每行不超过40个字符,并保存在另一文件中:
fold -w 40 ling-lines > short-lines
告诉fold不分隔单词:
fold -s -w 40 speech
18.8 80字符行
介绍了80字符行的由来,还顺便介绍了IBM公司。
18.9 格式化段落:fmt
相关过滤器:fold,pr
语法:fmt [-su] [-w width] [file...]
-u(uniform spacing):统一间距;-s(split only):拆分长行,但不连接短行
18.10 打印的旧时代
18.11 按页格式化文本:pr
相关过滤器:fold,fmt
语法:
pr [-dt] [+beg[:end]] [-h text] [-l n] [-o margin] [-W width] [file...]
beg是需要格式化的第一页,text是标题中间的文本;n是每页的行数;margin是左边缘的大小;width是输出的宽度;file是文件名。
18.12 按列格式化文本
语法: pr [-mt] [-columns] [-l lines] [-W width] [file...]