首页 > 运营 > 帮助中心 > 正文

shell脚本学习指南[二](Arnold Robbins & Nelson H.F. Beebe著)

2020-07-28 13:54:55
字体:
来源:转载
供稿:网友

该进入第四章了,刚才看到一个帖子标题:我空有一身泡妞的好本领,但可惜自己是个妞。汗~这个。。。音乐无国界嘛,这个不应该也没性别界么?

第四章文本处理工具

书中先说明了以下排序的规则,数值的就不用说了,该大就大该小就小,但是字符型很多时候是区分声调或者重音的。在命令行中输入locale查看自己系统的编码配置。默认的是系统配置里的,但是可以自己设置排序的编码。如:
复制代码 代码如下:
$ LC_ALL=C sort french-english #以传统ASCII码顺序排序

下边介绍以下排序命令sort:
语法: sort [ options ] [ file(s} ]
主要选项: -b 忽略开头的空白
-c 检查输入是否已正确地排序。如果未排序,则退出码为非零值,不会有任何输出
-d 字典顺序,仅文字数字和空白才有意义。
-g 一般数值:以浮点数字类型比较字段。仅GNU版本提供此选项功能
-f 将混用的字母都看作相同大小写,即忽略大小写。
-i 忽略无法打印的字符。
-k 定义排序键值字段
-m 将已排序的输入文件,合并为一个排序后的输出数据流
-n 以整数类型比较字段
-o outfile 将输出写到指定文件
-r 倒置排序由大到小,默认由小到大
-t char 使用单个字符char作为默认的字段分隔符取代空白字符
-u 只有唯一记录,丢弃所有具有相同键值的记录只留第一条。
另外排序键值字段类型标识,即-k一个字段之后的修饰符字母:
b 忽略开头的空白
d 字典顺序
f 不区分大小写
g 以一般的浮点数进行比较,只适用GNU版本
i 忽略无法打印的字符
n 以整数数字比较
r 倒置排序顺序
字段以及字段里的字符是由1开始编号的。如果仅指定一个字段编号,则排序键值会自该字段的起始处开始,一直继续到记录的结尾(而非字段结尾)。
如果给的是一对用逗号隔开的字段数字,则排序键值将由第一个字段值起开始,到第二个指定字段结尾结束。可能出现多个-k,会从第一个开始。

例子:
复制代码 代码如下:
$ sort -t: -k1,1 /etc/passwd #以用户名称排序
$ sort -t: -k2nr /etc/passwd #反向UID的排序
$ sort -t: -k4n -k3n /etc/passwd $以GID与UID排序

关于sort的效率,搞算法的都比较了解目前各种排序算法的效率,这里的sort也没啥特别的,类似STL估计,组合排序算法尽可能的优化过了。不是搞算法的童鞋也不用了解了,相信它的效率就好了。

有时候我们还十分关心排序的稳定性,默认情况下是不稳定的,但是GNU实现了coreutils包弥补了不足,可以通过--stable选项来解决稳定性问题。(不懂稳定性的简单说一下:意思就是排序键值等同的时候需要以输入顺序来输出,即排序不打乱输入顺序)

有时候我们还需要解决输入数据的重复问题,sort -u能够解决一些,但是它消除的操作依据的是匹配的键值,而非匹配的记录。uniq命令提供另一种过滤数据的方式:它常用于管道中,用来删除已适用sort排序完成的重复记录。uniq有3个好用的选项:-c 可在每个输出行之前加上该行的重复次数。 -d选项则用于仅显示重复的行。 -u仅显示未重复的行。这里需要注意一点,uniq处理数据前是需要sort对数据进行排序的!

另外我们处理大量这样的数据的时候,我们需要重新格式化段落以方便我们使用或阅读。这时候可以使用fmt命令,有两个常用的选项:-s 仅切割较长的行,短行不会合并 ; -w n 则设置输出行宽度为n个字符(默认75个左右)。要考虑fmt移植性的请另行查询文档。

这里对可能使用到的统计行数、字数、字符数的wc命令做一个介绍,选项有-c 字节数 -l行数 -w 字数 。默认情况下给出行数 字数 字节数。

好了,处理了那么多文本,我们可能要打印出来看看,unix里支持的打印功能包括两类不同的命令,但拥有相同的功能,商用的unix系统与GNU/linux通常两种都支持,不过BSD系统仅支持Berkeley风格,POSIX则只定义了lp命令。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表