shell编程入门(三)

文本处理工具

排序文本

sort将输入看作具有多条记录的数据流,而记录是由可变宽度的字段组成,记录是以换行字符作为定界符,字段的定界符则是空白字符或者是用户指定的单个字符。

行的排序

sort

  1. 语法:

    sort [ options ] [ file(s) ]

  2. 用途:

    将输入行按照键值字段与数据类型选项以及locale排序。

  3. 主要选项
  -b
        忽略开头的空白。
  -c
        检查输入是否已经正确的排序。如输入未经排序,但退出码为非零值,则不会有任何输出。
  -d
        字典顺序:仅文字数字与空白有才意义。
  -g
        一般数值:以浮点数字类型进行比较字段。这个选项的运作有点类似-n,差别在于这个选项的数字可能有小数点以及指数。仅GNU版本提供此功能。
  -f
        将混用的字母看作相同大小写,也就是不管字母大小写的方式排序。
  -i
        忽略无法打印的字符。
  -m
        将已排序的输入文件,合并为一个排序后的输出文件流。
  -n
        以整数类型进行字段。
  -o outfile
        将输出写到指定文件,而非标准输出。如果该文件为输入文件之一,则sort在进行排序与写到输出文件之前,会将它复制到一个临时的文件。
  -r
        倒置排序的顺序为由大到小(descending),而非默认的由小至大(ascending)。
  -t char
        使用单个字符char作为默认的字段分隔字符,取代默认的空白字符。
  -u
        只有唯一的记录:丢弃所有具有相同键值的记录,只留其中的第一条。只有键值字段是重要的,也就是说:被丢弃的记录的其他部分可能是不同值。
  1. 行为模式

    sort会读取指定文件,如果未给定文件,则读取标准输入,再将排序好的数据写至标准输出。

以字段排序

如果要进一步控制排序操作,可以用-k选项来指定排序字段,并且用-t选项来选择字段的定界符。如果没有指定-t,则表示字段以空白分隔且记录中开头和结尾的空白都将忽略。

字符以及字段里面的字符都是1开始。

  1. 如果仅指定一个字段编号,则排序键值会自该字段的起始处开始,一直继续到记录的结束(而非字段的结尾)。
  2. 如果给的是一对用逗号隔开的字段数字,则排序键值将由第一个字段值得起始处开始,结束于第二个字段值得结尾。例如:sort -k2.1,3.5 filename
  3. 如果一个排序键值的起始正好落在记录的结尾处之后,则排序值为空,并且空的排序键值在排序时将优先于所有非空的键值。
  4. 复杂的应用:-k3nr,3:从字段3起始处开始,以数值类型反向排序,并结束于字段3的结尾。
文本块排序
sort的稳定性

在排序算法中有个重要的问题:是否稳定。sort本身是不稳定的。但是我们可以使用参数:--stable来弥补。

删除重复

sort -u的用法,消除操作是依据匹配的键值,而非分配的记录。uniq命令提供了另外一种过滤数据的方式:常用于管道中,用来删除已使用sort排序完成的重复记录。

uniq有三个常用的选项:

  -c
    在每个输出行之前加上该行重读的次数。
  -d
    仅显示重复的行。
  -u
    仅显示未重复的行。

重新格式化段落

fmt来格式化我们需要的数据。

  -c
    Center the text, line by line.  In this case, most of the other options are ignored; no splitting or joining of lines is done.
  -m
    Try to format mail header lines contained in the input sensibly.
  -n
    Format lines beginning with a `.' (dot) character.  Normally, fmt does not fill these lines, for compatibility with nroff(1).
  -p
    Allow indented paragraphs.  Without the -p flag, any change in the amount of whitespace at the start of a line results in a new paragraph being begun.
  -s
    Collapse whitespace inside lines, so that multiple whitespace characters are turned into a single space.  (Or, at the end of a sentence, a double space.)
  -d chars
    Treat the chars (and no others) as sentence-ending characters.  By default the sentence-ending characters are full stop (`.'), question mark (`?') and exclamation mark (`!').  Remember that some characters may need to be escaped
    to protect them from your shell.
  -l number
    Replace multiple spaces with tabs at the start of each output line, if possible.  Each number spaces will be replaced with one tab.  The default is 8.  If number is 0, spaces are preserved.

  -t number
    Assume that the input files' tabs assume number spaces per tab stop.  The default is 8.

计算行数、字数以及字符数

使用wc来统计行数、字数以及字节数。

常用选项:

  -c
    表示字符数。但是由于现在有多字节字符集的编码存在-如UTF-8。因此在当前系统上,字节数已不再等同于字符数。因此,POSIX出现`-m`选项,用以计算多字节字符,对于8位字符数据而言,`-m`等同于`-c`。
  -l
    计算行数
  -w
    计算字数

提取开头或结尾数行

显示标准输入前n条记录:

  head -n n [ file(s) ]
  head -n [ file(s) ]
  awk 'FNR <=n' [ file(s) ]
  sed -e nq [ file(s) ]
  sed nq [ file(s) ]

显示结尾数行:

  tail -n n [ file(s) ]
  tail -n [ file(s) ]

参考资料:
Shell脚本学习指南 作者:(美)罗宾著
备注:
转载请注明出处:http://blog.csdn.net/wsyw126/article/details/53228962
作者:WSYW126

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值