基本文本处理

排序文本sort 命令
用途:排序文件、对已排序的文件进行合并,并检查文件以确定它们是否已排序。
语法:
sort [ -A ] [ -b ] [ -c ] [ -d ] [ -f ] [ -i ] [ -m] [ -n ] [ -r ] [ -u ] [ -o OutFile ] [ -t Character ] [ -T Directory ] [ -y [ Kilobytes ] ] [ -z RecordSize ] [ [ + [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ] ] [ - [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ] ] ] ... [ -k KeyDefinition ] ... [ File ... ]
描述:
sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出。如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序。-(减号)代替文件名指定标准输入。如果您不指定任何文件名,那么该命令对标准输入排序。可以使用 -o 标志指定输出文件。
如果不指定任何标志,sort 命令基于当前语言环境的整理顺序对输入文件的所有行排序。
排序关键字
参数描述:

 

-A 使用 ASCII 整理顺序代替当前语言环境的整理顺序在逐字节的基础上排序。
-b 忽略前导空格和制表符,找出字段的第一或最后列。
-c 检查输入是否已按照标志中指定的排序规则进行排序。如果输入文件排序不正确,就返回一个非零值。
-d 使用字典顺序排序。比较中仅考虑字母、数字和空格。
-f 比较前将所有小写字母改成大写字母。
-i 比较中忽略所有非打印字符。
-k KeyDefinition 指定排序关键字。KeyDefinition 选项的格式为:

[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]

排序关键字包括所有以 FStart 变量指定的字段和 CStart 变量指定的列开头的字符及以 FEnd 变量指定的字段和 CEnd 变量指定的列结束的字符。Modifier 变量的值可以是 bdfin 或r。 修饰符与同一字母的标志等价。

-m 只合并多个输入文件;假设输入文件已经排序。
-n 按算术值对数字字段排序。数字字段可包含前导空格、可选减号、十进制数字、千分位分隔符和可选基数符。对包含任何非数字字符的字段进行数字排序会出现无法预知的结果。
-o OutFile 将输出指向 OutFile 参数指定的文件,而不是标准输出。OutFile 参数值可以与File 参数值相同。
-r 颠倒指定排序的顺序。
-t Character 指定 Character 为单一的字段分隔符。
-u 禁止按照排序关键字和选项的所有等同排序(每一组行中一行除外)。
-T Directory 将创建的所有临时文件放入 Directory 参数指定的目录中。
-y[Kilobytes] 用 Kilobytes 参数指定的主存储的千字节数启动 sort 命令,并根据需要增加存储量。(如果Kilobytes 参数指定的值小于最小存储站点或大于最大存储站点,就以这个最小存储站点或最大存储站点取代)。如果省略-y 标志,sort 命令以缺省的存储大小启动。-y0 标志用最小存储启动,而-y 标志(不带Kilobytes 值)用最大存储启动。sort 命令使用的存储量显著地影响性能。以大存储量对小文件排序将很浪费。
-z RecordSize 如果正在排序的任一行大于缺省的缓冲区大小,要防止出现异常终止。指定 -c 或 -m 标志时,省略排序阶段,使用系统的缺省缓冲大小。如果已排序行超出这一大小,排序异常终止。-z 选项指定排序阶段最长行的记录,因而可在合并阶段分配足够的缓冲区。RecordSize 必须指明等于或大于要合并的最长行的字节值。

 

 

例子:# sort -t : -k 3 /etc/passwd       根据/etc/passwd文件中的第三列来将passwd文件进行排序后输出

-d会忽略%

  1. 要在 LC_ALLLC_COLLATE 或 LANG 环境变量设置为En_US 的情况下排序fruits 文件,请输入:

     

    LANG=En_US sort fruits

    此命令序列显示以升序词典顺序排序的 fruits 文件的内容。每一列的字符,包括空格、数字和特殊字符都经一一比较。例如,如果fruits 文件包含文本:

    banana
    orange
    Persimmon
    apple
    %%banana
    apple
    ORANGE

    sort 命令显示:

    %%banana
    ORANGE
    Persimmon
    apple
    apple
    banana
    orange

    在 ASCII 整理序列中,%(百分号)在大写字母前,大写字母在小写字母前。如果您当前的语言环境指定 ASCII 之外的字符集,结果可能不同。

  2. 要以字典顺序排序,请输入:
    sort  -d fruits
    此命令序列排序和显示 fruits 文件的内容,并且只比较字母、数字和空格。如果 fruits 文件与示例 1 相同,那么 sort 命令显示:

     

    ORANGE
    Persimmon
    apple
    apple
    %%banana
    banana
    orange

    -d 标志忽略 %(百分号)字符,因为它不是个字母、数字或空格。(即%%banana 被banana 取代)。

  3. 要将包含大写字母和具有类似小写行的特殊字符行分组,请输入:
    sort -d -ffruits
    -d 标志忽略特殊字符,-f 标志忽略大小写差异。将 LC_ALLLC_COLLATE 或 LANG 环境变量设置为C 的情况下,fruits 文件的输出结果变为:

     

    apple
    apple
    %%banana
    banana
    ORANGE
    orange
    Persimmon
  4. 要除去重复行排序,请输入:
    sort  -d  -f  -u fruits
    -u 标志告诉 sort 命令除去重复的行,使文件中的每一行唯一。此命令序列显示:

     

    apple
    %%banana
    orange
    Persimmon

    不仅除去重复的 apple,而且也除去了 banana 和 ORANGE。除去这些是因为-d 标志忽略%% 这个特殊字符,-f 标志忽略大小写差异。

  5. 要如例 4 那样排序,除去重复的实例(除非是大写字母或标点不同),请输入:
    sort  -u +0  -d-f+0 fruits
    输入 +0 -d -f 完成的排序与示例 3 中 -d -f 的排序类型相同,+0 进行另一项比较以区分不一样的行。这防止-u 标志将它们除去。

    示例 1 所示的 fruits 文件中,添加的 +0 将 %%banana 与banana 及ORANGE 与 orange 区分开来。然而,apple 的两个实例是相同的,所以其中之一被删除。

     

    apple
    %%banana
    banana
    ORANGE
    orange
    Persimmon
  6. 要指定分隔字段的字符,请输入:
    sort  -t: +1 vegetables
    此命令序列排序 vegetables 文件,对每一行上第一个冒号后的文本进行比较。+1 告诉 sort 命令忽略第一字段,从第二字段的开始到该行的结束进行比较。-t: 标志告诉 sort 命令冒号分隔字段。如果vegetables包含:

     

    yams:104
    turnips:8
    potatoes:15
    carrots:104
    green beans:32
    radishes:5
    lettuce:15

    那么,将 LC_ALLLC_COLLATE 或LANG 环境变量设置为 C 的情况下,sort 命令将显示:

    carrots:104
    yams:104
    lettuce:15
    potatoes:15
    green beans:32
    radishes:5
    turnips:8

    注意数字没有按照数字排序。当用字典式分类从左至右比较每一个字符时出现这种情况。换句话说,3 在5 之前,所以32 在 5 之前。

  7. 要排序数字,请输入:
    sort  -t: +1  -nvegetables
    此命令序列按照第二个字段对 vegetables 文件进行数字排序。如果 vegetables 文件与示例 6 中的相同,那么sort 命令将显示:

     

    radishes:5
    turnips:8
    lettuce:15
    potatoes:15
    green beans:32
    carrots:104
    yams:104
  8. 要对多个字段排序,请输入:
    sort  -t: +1 -2  -n+0 -1  -rvegetables
    sort  -t:  -k2,2n-k1,1 vegetables
    此命令序列对第二字段(+1 -2 -n)进行数字排序。在这个顺序中,它以逆字母顺序(+0 -1 -r)对第一字段排序。将 LC_ALLLC_COLLATE 或 LANG 环境变量设置为 C 的情况下,输出将类似于:

     

    radishes:5
    turnips:8
    potatoes:15
    lettuce:15
    green beans:32
    yams:104
    carrots:104

    此命令按数字顺序对行排序。当两行数字相同时,它们以逆字母顺序出现。

  9. 要使用排序的文本替换原始文件,请输入:
    sort  -o vegetables vegetables
    此命令序列将排序输出存入 vegetables 文件( -o vegetables)。

uniq命令-----文本除重

文件经过处理后在它的输出文件中可能会出现重复的行。例如,使用cat命令将两个文件合并后,再使用sort命令进行排序,就可能出现重复行。这时可以使用uniq命令将这些重复行从输出文件中删除,只留下每条记录的唯一样本。

语法:
uniq [选项] 文件 
说明:这个命令读取输入文件,并比较相邻的行。在正常情况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不同。如果输入文件用“- ”表示,则从标准输入读取。

 -c或--count   在每列旁边显示该行重复出现的次数。
  -d或--repeated   仅显示重复出现的行列。
  -f<栏位>或--skip-fields=<栏位>   忽略比较指定的栏位。
  -s<字符位置>或--skip-chars=<字符位置>   忽略比较指定的字符。
  -u或--unique   仅显示出一次的行列。
  -w<字符位置>或--check-chars=<字符位置>   指定要比较的字符。
  --help   显示帮助。
  --version   显示版本信息。
例子:

 [root@stu100 ~]# cat test 

  boy took bat home 

  boy took bat home 

  girl took bat home 

  dog brought hat home 

  dog brought hat home 

  dog brought hat home 

  看test文件的内容,可以看到其中的连续重复行 

  [root@stu100 ~]# uniq test 

  boy took bat home 

  girl took bat home 

  dog brought hat home 

  uniq命令不加任何参数,仅显示连续重复的行一次 

  [root@stu100 ~]# uniq -c test 

  2 boy took bat home 

  1 girl took bat home 

  3 dog brought hat home 

  -c 参数显示文件中每行连续出现的次数。 

  [root@stu100 ~]# uniq -d test 

  boy took bat home 

  dog brought hat home 

  -d选项仅显示文件中连续重复出现的行。 

  [root@stu100 ~]# uniq -u test 

  girl took bat home 

  -u选项显示文件中没有连续出现的行。 

  [root@stu100 ~]# uniq -f 2 -s 2 test 

  boy took bat home 

  忽略每行的前2个字段,忽略第二个空白字符和第三个字段的首字符,结果at home 

  [root@stu100 ~]# uniq -f 1 test 

  boy took bat home 

  dog brought hat home 

  忽略每行的第一个字段,这样boy ,girl开头的行看起来是连续重复的行

文件的打印和格式化输出

文件打印---pr命令

pr是一个标准的输出工具,可以直接输出到打印机,如果你希望将结果保存在文件中,则需要重定向它的输出,如下面这个例子:
  $ pr file.txt file.output
可以用来控制文本输出效果的参数很多,一般来说,每页的标题就是这个文档的文件名。当然,用户也可以自行定义标题,比如:
  $ pr -h "My report" file.txt


使用fmt命令格式化文本

语  法:fmt [-cstu][-p<列起始字符串>][-w<每列字符数>][--help][--version][文件...]

参  数:
-c或–crown-margin 每段前两列缩排。
-p<列起始字符串>或-prefix=<列起始字符串> 仅合并含有指定字符串的列,通常运用在程序语言的注解方面。
-s或–split-only 只拆开字数超出每列字符数的列,但不合并字数不足每列字符数的列。
-t或–tagged-paragraph 每列前两列缩排,但第1列和第2列的缩排格式不同。
-u或–uniform-spacing 每个字符之间都以一个空格字符间隔,每个句子之间则两个空格字符分隔。
-w<每列字符数>或–width=<每列字符数>或-<每列字符数> 设置每列的最大字符数。

文本的提取

cut命令

cut命令可以从一个文本文件或者文本流中提取文本列。

cut [选项]… [文件]…

选项说明:

-b, –bytes=LIST 以字节为单位取出固定字节区间

-c, –characters=LIST 以字符为单位取出固定字符区间

-d, –delimiter=DELIM 指定分隔符来代替默认的TAB分隔符

-f, –fields=LIST 依据 -d 指定的分隔符将一段内容分割成为数段,用 -f 取出第几段的意思

-n with -b: 不分隔多字节字符

–complement 补充选定的字节,字符集或字段

-s, –only-delimited 不打印不包含分隔符的行

–output-delimiter=STRING 使用String 作为输出分隔符,默认的是使用输入分隔符

  • 仅使用f -b, -c 或-f 中的一个。每一个列表都是专门为一个类别作出的,或者您可以用逗号隔   
  • 开要同时显示的不同类别。您的输入顺序将作为读取顺序,每个仅能输入一次。   
  • 每种参数格式表示范围如下:   
  •  N    从第1 个开始数的第N 个字节、字符或域   
  •  N-    从第N 个开始到所在行结束的所有字符、字节或域   
  •  N-M    从第N 个开始到第M 个之间(包括第M 个)的所有字符、字节或域   
  •  -M    从第1 个开始到第M 个之间(包括第M 个)的所有字符、字节或域  

    例子:

    1,测试文件

    1. [zhangy@BlackGhost comte]$ cat test  
    2. test:x:1003:1003::/home/test:/bin/bash  
    3. 张ying:x:1004:1004::/home/test:/bin/bash  
    4. policykit:x:102:1005:PolicyKit:/:/sbin/nologin  
    5. postfix:x:73:73::/var/spool/postfix:/bin/false  

    上面是/etc/passwd文件中的一部分,加了点中文在里面

    2,-b和-c的用法

    1. [zhangy@BlackGhost comte]$ cut -b 1-10 test     //取得文件中第1个字节到第10个字节的内容  
    2. test:x:100  
    3. 张ying:x:  
    4. policykit:  
    5. postfix:x:  
    6. [zhangy@BlackGhost comte]$ cut -b 1,4,5,7,10 test  //取文件中第1,4,5,7,10字节的内容  
    7. tt::0  
    8. �yig:    //为什么会出现乱码吗,因为汉字所占字节数大于1,分开的话,肯定会显示错误的  
    9. pick:  
    10. ptfx:  

    -c的用法根-b差不多,只不过一个截取时是字节为单位,一个是以字符为单位

    3,-d和-f的用法

    1. [zhangy@BlackGhost comte]$ cut -f 1 test     //不分割都显示出来  
    2. test:x:1003:1003::/home/test:/bin/bash  
    3. 张ying:x:1004:1004::/home/test:/bin/bash  
    4. policykit:x:102:1005:PolicyKit:/:/sbin/nologin  
    5. postfix:x:73:73::/var/spool/postfix:/bin/false  
    6. [zhangy@BlackGhost comte]$ cut -d : -f1  test  //分割了显示分割后的第一个域  
    7. test  
    8. 张ying  
    9. policykit  
    10. postfix  

    -d后面根的冒号是分割文件行的的分割符,-d一般情况下根-f一起使用,而不能和-b,-c一起使用

    4,-s的用法

    1. [zhangy@BlackGhost comte]$ cut -d : -f 1-5 -s --output-delimiter="|" test  
    2. test|x|1003|1003|  
    3. 张ying|x|1004|1004|  
    4. policykit|x|102|1005|PolicyKit  
    5. postfix|x|73|73|  

    -s起到了输出控制的作用。

    使用join连接字段

    join  命令

    功能说明:将两个文件中,指定栏位内容相同的行连接起来。

    语  法:join [-i][-a<1或2>][-e<字符串>][-o<格式>][-t<字符>][-v<1或2>][-1<栏位>][-2<栏位>][--help][--version][文件1][文件2]

    补充说明:找出两个文件中,指定栏位内容相同的行,并加以合并,再输出到标准输出设备。

    参  数:
      -a<1或2>   除了显示原来的输出内容之外,还显示指令文件中没有相同栏位的行。
      -e<字符串>   若[文件1]与[文件2]中找不到指定的栏位,则在输出中填入选项中的字符串。
      -i或--igore-case   比较栏位内容时,忽略大小写的差异。
      -o<格式>   按照指定的格式来显示结果。
      -t<字符>   使用栏位的分隔字符。
      -v<1或2>   跟-a相同,但是只显示文件中没有相同栏位的行。
      -1<栏位>   连接[文件1]指定的栏位。
      -2<栏位>   连接[文件2]指定的栏位。
    join类似 db里面的join方法,同样有left join right join inner join等

    指定参数-a 可以指定join的方式。 -a1表示 显示第一个文件中不匹配的行,即为left join
                                                -a2 表示 显示第二个文件中不匹配的行,即为right join

    使用示例:

    $ cat employee.txt
    100 Jason Smith
    200 John Doe
    300 Sanjay Gupta
    400 Ashok Sharma
    $ cat bonus.txt
    100 $5,000
    200 $500
    300 $3,000
    400 $1,250
    $ join employee.txt bonus.txt
    100 Jason Smith $5,000
    200 John Doe $500
    300 Sanjay Gupta $3,000
    400 Ashok Sharma $1,250

posted on 2012-05-08 17:23  生活费  阅读(335)  评论(0编辑  收藏  举报

导航