linux sort 函数

sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入。

来自: http://man.linuxde.net/sort

-------------------------------------------------

sort [参数][参数] file

选项:

-b:忽略每行前面开始出的空格字符;

-c:检查文件是否已经按照顺序排序;

-d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;

-f:排序时,将小写字母视为大写字母;

-i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符;

-m:将几个排序号的文件进行合并;

-M:将前面3个字母依照月份的缩写进行排序;

-n:依照数值的大小排序;

-o<输出文件>:将排序后的结果存入制定的文件;

-r:以相反的顺序来排序; -t<分隔字符>:指定排序时所用的栏位分隔字符;

-u:忽略相同行使用 (uniq file = sort -u file)

-R:随机排序
+<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。

k的用法:

FStart.CStart Modifie,FEnd.CEnd Modifier 
      -------Start--------,-------End--------
    FStart.CStart 选项 , FEnd.CEnd 选项 
这个语法格式可以被其中的逗号,分为两大部分,Start部分和End部分。Start部分也由三部分组成,
其中的Modifier部分就是我们之前说过的类似n和r的选项部分。我们重点说说Start部分的FStart和C.Start。C.Start也是可以省略的,
省略的话就表示从本域的开头部分开始。FStart.CStart,其中FStart就是表示使用的域,
而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。
同理,在End部分中,你可以设定FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。
或者,如果你将CEnd设定为0(零),也是表示结尾到“域尾”。   

举例:

只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序:

$ sort -t ' ' -k 1.2,1.2 -nrk 3,3 facebook.txt 
baidu 100 5000 
google 110 5000 
sohu 100 4500 
guge 50 3000

由于只对第二个字母进行排序,所以我们使用了-k 1.2,1.2的表示方式,
表示我们“只”对第二个字母进行排序。
(如果你问“我使用-k 1.2怎么不行?”,当然不行,因为你省略了End部分,这就意味着你将对从第二个字母起到本域最后一个字符为止的字符串进行排序)。
对于员工工资进行排 序,
我们也使用了-k 3,3,这是最准确的表述,表示我们“只”对本域进行排序,因为如果你省略了后面的3,就变成了我们“对第3个域开始到最后一个域位置的内容进行排序” 了。

现在 我们来举几个简单的例子:

#将BB列按照数字从小到大顺序排列: 
[root@mail text]# sort -nk 2 -t: sort.txt 
AAA:BB:CC 
bbb:10:2.5 
ddd:20:4.2 
aaa:30:1.6 
eee:40:5.4 
ccc :50:3.3 
eee:60:5.1 
#将CC列数字从大到小顺序排列: 
[root@mail text]# sort -nrk 3 -t: sort.txt 
eee:40:5.4 
eee:60:5.1 
ddd:20:4.2 
ccc:50:3.3 
bbb:10:2.5 
aaa:30:1.6 
AAA:BB:CC 
# -n是按照数字大小排序,-r是以相反顺序,-k是指定需要排序的栏位,-t指定栏位分隔符为冒号

 

uniq命令

uniq命令常用语报告或者消除文件中的重复内容,一般与sort命令结合使用。

命令选项

  • -c:在每行开头显示重复行出现的次数;
  • -d:仅显示重复的列;
  • -f 栏位:忽略指定的栏;
  • -s N:指定可以跳过前N个字符;
  • -w 字符位数:指定用于比较的最大字符数;
  • -u:仅显示出现一次的行列;

uniq用法

删除重复行:

uniq file.txt
sort file.txt | uniq
sort -u file.txt

只显示单一行:

uniq -u file.txt
sort file.txt | uniq -u

统计各行在文件中出现的次数:

sort file.txt | uniq -c

在文件中找出重复的行:

sort file.txt | uniq -d

unix/liunx uniq详解   uniq:
 功能说明:检查及删除文本文件中重复出现的行列。

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

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

注意: uniq所认为的重复行是指连续出现的重复行!      

参 数:   -c或--count   在每列旁边显示该行重复出现的次数。  

-d或--repeated   仅显示重复出现的行列。  

-f<栏位>或--skip-fields=<栏位>   忽略比较指定的栏位。  

-s<字符位置>或--skip-chars=<字符位置>   忽略比较指定的字符。  

-u或--unique   仅显示出一次的行列。  

-w<字符位置>或--check-chars=<字符位置>   指定要比较的字符。  

--help   显示帮助。  

--version   显示版本信息。  

[输入文件]   指定已排序好的文本文件。

[输出文件]   指定输出的文件。  

我们看日志的时候,可以先用-s或-f跳过日期,再去掉重复行。

 

用uniq命令可以删除相邻的重复行:
uniq [file]
但如果一文本中有重复却不相邻的行则无法删除,需要结合sort命令:
sort [file]|uniq
等效的sort命令是:
sort -u [file]
另外uniq命令有4个有用的选项:

$uniq -d file 只输出file中的重复行,且只输出一次,但不输出唯一的行
$uniq -u file 只输出file中的唯一行(当然是一次啦)
$uniq -c file 在每行前显示重复次数,可与其他选项结合,例如-cu或-cd或-c
$uniq -i file 比较时忽略大小写

-d 的结果和-u 的结果合并起来就是uniq的结果了。

[root@AY140417160054681ae5Z ~]# cat >seq.txt  

  1. banana  
  2. apple  
  3. pear  
  4. orange  
  5. banana 

[root@AY140417160054681ae5Z ~]# sort seq.txt | uniq -c  

  1. 1 apple  
  2. 2 banana  
  3. 2 orange  
  4. 1 pear  

 

posted @ 2016-12-22 10:13  小丑的·凡尘朽  阅读(3293)  评论(0编辑  收藏  举报