shell快速排序、去重文本内容

    逛ChinaUnix论坛,经常可看到到日经帖,怎么快速排序一个文本内容,或者计算某行出现次数。这些问 题大部分均可以经过简单的sort、uniq命令来解决。ide

首先准备两个文本spa

cat file1:3d

Boys in Company C       :HK     :192    :2192orm

Alien                   :HK     :119    :1982排序

The Hill                :KL     :63     :2972ip

Aliens                  :HK     :532    :4892it

Star Wars               :HK     :301    :4102io

A Few Good Men          :KL     :445    :5851class

Toy Story               :HK     :239    :3972awk

cat file2:

boy took bat home

boy took bat home

girl took bat home

boy took bat home

boy took bat home

dog brought hat home

dog brought hat home

dog brought hat home



sort:

将文件的每一行做为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。


经常使用的几个参数: sort -mnrtku

m:合并文件

n:按数值大小来排序

r:逆序排

t:自定义分隔符来划分域

k:选定域来排序

u:全文本去重

域至关于列

一、sort -m file1 file2 合并两个文件

Boys in Company C       :HK     :192    :2192

Alien                   :HK     :119    :1982

boy :took :bat :home

boy :took :bat :home

girl :took :bat :home

boy :took :bat :home

boy :took :bat :home

dog :brought :hat :home

dog :brought :hat :home

dog :brought :hat :home

The Hill                :KL     :63     :2972

Aliens                  :HK     :532    :4892

Star Wars               :HK     :301    :4102

A Few Good Men          :KL     :445    :5851

Toy Story               :HK     :239    :3972

二、-n参数是有时候会排序出现10比2小的状况,由于sort是直接比较第一个字符,因此要使用-n来进行数值比较。

三、-r参数,sort排序小的排上,大的在下,有时候行数不少,你只想知道最大的就能够sort -r |more就能够了。

四、-t参数,选定分隔域符号,这个经常和-k参数一块儿用,如咱们须要按file1的第三列的数值大小排序

sort -n -t:-k3 file1

The Hill                :KL     :63     :2972

Alien                   :HK     :119    :1982

Boys in Company C       :HK     :192    :2192

Toy Story               :HK     :239    :3972

Star Wars               :HK     :301    :4102

A Few Good Men          :KL     :445    :5851

Aliens                  :HK     :532    :4892

若是不加-n参数

sort  -t: -k3 file1  

Alien                   :HK     :119    :1982

Boys in Company C       :HK     :192    :2192

Toy Story               :HK     :239    :3972

Star Wars               :HK     :301    :4102

A Few Good Men          :KL     :445    :5851

Aliens                  :HK     :532    :4892

The Hill                :KL     :63     :2972

隐藏属性,sort的输出都是标准屏幕输出,若是咱们要输出到源文件,使用重定向就会杯具。。

sort file1>file1;cat file1,你会获得一个空文件。这时候要使用-o参数来实现这个功能。

sort file1 -o file1


uniq:

   这个命令读取输入文件,并比较相邻的行。在正常状况下,第二个及之后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的。该命令加工后的结果写到输出文件中。输入文件和输出文件必须不一样。若是输入文件用“- ”表示,则从标准输入读取。

它与sort -u的区别在于,sort -u是全文本去重,而uniq是比较相邻行,将第二个及之后更多重复行删去。

语法:uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]

补充说明:uniq可检查文本文件中重复出现的行列。

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

经常使用的是-c参数,显示行的重复出现次数。

uniq -c file2

      2 boy :took :bat :home

      1 girl :took :bat :home

      2 boy :took :bat :home

      3 dog :brought :hat :home

但因为是只比较相邻行,因此仍是配合sort先排序一下:

 sort file2 |uniq -c

      4 boy :took :bat :home

      3 dog :brought :hat :home

      1 girl :took :bat :home

这样才获得咱们想要的结果。

最后再把这两个文件合并的漂亮一点:

 sort -m file1 file2 |sort |uniq -c |sed 's/ //g'|awk -F ":" '{printf ("%-10s %10s %10s %10s\n",$1,$2,$3,$4)}'

1AFewGoodMen         KL        445       5851

1Alien             HK        119       1982

1Aliens            HK        532       4892

1BoysinCompanyC         HK        192       2192

4boy             took        bat       home

3dog          brought        hat       home

1girl            took        bat       home

1StarWars          HK        301       4102

1TheHill           KL         63       2972

1ToyStory          HK        239       3972

感受仍是很坑爹。。

一、sort -m竟然只合并,没有排序

二、printf的对齐,看上去这么怪。。

相关文章
相关标签/搜索