2.9排序、唯一与重复

sort命令能够帮助我们队文本文件和stdin进行排序操作。它通常会配合其他命令来生成所需要的输出。uniq是一个经常与sort一同使用的命令。它的作用是从文本或stdin中提取唯一(或重复)的行。

1、sort命令既可以从特定的文件,也可以从stdin中获取输入,并将输出写入stdout。uniq和sort的工作方式一样。

a、可以按照下面的方式对一组文件进行排序:

$sort file1.txt file2.txt >sorted.txt

或是

$ sort file1.txt file2.txt -o sorted.txt

b、按照数字顺序进行排序:

$ sort -n file.txt

c、按照逆序进行排序:

$ sort -r file.txt

d、按照月份进行排序

$sort -M months.txt

e、合并两个已排序过的文件;

$sort -m sorted1 sorted2

f、找出已排序文件中不重复的行:

$sort file1.txt file2.txt | uniq

g、检查文件是否已经排序过

#!/bin/bash

#功能描述:排序

sort -C filename;

if [ $? -eq 0 ] ; then

  echo Sorted;

else

  echo Unsorted;

fi

将filename替换成你需要进行检查的文件名,然后运行该脚本。

2、工作原理

sort命令包含大量的选项,能够对文件数据进行各种排序。如果使用uniq命令,那sort更是必不可少,因为前者要求输入数据必须经过排序。

要检查文件是否排序过,可以采用以下方法:如果文件已经排序,sort会返回为0的退出码($?),否则返回非0.

3、补充内容

a、依据键或列进行排序

按列将下面的文本排序

$ cat data.txt

1 mac  2000

2 winxp 4000

3 bsd   1000

4 linux  1000

有多重方法对这段文本进行排序。目前它是按照序号第一列来排序的。也可以依据第二列和第三列来排序。

-k指定了排序应该按照哪一个键(key)来进行。键指的是列号,而列号就是执行排序时的依据。-r 告诉sort命令按照逆序进行排序。如

eg;依据第一列,以逆序形式排序

$ sort -nrk 1 data.txt

其中,-nr表明按照数字,采用逆序形式排序

依据第2列进行排序

$sort -k 2 data.txt

注意:一定要留意用于按数字顺序进行排序的选项-n。sort命令对于字母表排序和数字排序有不同的处理方式。因此,如果要采用数字顺序排序,就应该明确地给出-n选项。

通常在默认情况下,键就是文本文件中的列。列与列之间用空格分隔。

但有时候,我们需要将特定范围内的一组字符(如:key1=character4-character8)作为键。在这种情况下,必须明确地将键指定为某个范围内的字符,这个范围可以用键起止的字符位置来表明。如:

$cat data.txt

1010hellothis

2189ababbba

7464dfddfdfd

$sort -nk 2,3 data.txt

把醒目的字符作为数值键。为了提取这个键,用字符在行内的起止位置作为键的书写格式(在上面的例子中,起止位置是2和3).

用第一个字符作为键:

$sort -nk 1,1 data.txt

为了使sort的输出与以\0作为终止符的xargs命令相兼容,采用下面的命令:

$sort -z data.txt | xargs -0

#终止符\0用来保证xargs命令的使用安全

如果要忽略掉文本中的空格,以字典序进行排序,可以使用:

$sort -bd unsorted.txt

其中,选项-b用于忽略文件中的前导空白行,选项-d用于指明以字典序进行排序。

2、uniq

uniq命令通过消除重复内容,从给定输入中(stdin或命令行参数文件)找出唯一的行。它也可以用来找出输入中出现的重复行。

uniq只能作用于排过序的数据输入,因此,uniq要么使用管道,要么将排过序的文件作为输入,与sort命令结合使用。

eg:

$cat sorted.txt

bash

foss

hack

hack

$uniq sorted.txt

bash

foss

hack

或是$sort unsorted.txt | uniq

只显示唯一的行(在输入文件中没有重复出现的行)

$uniq -u sorted.txt

bash

foss

或是$sort unsorted.txt |uniq -u

要统计各行在文件中出现的次数,使用

$sort unsorted.txt |uniq -c

1 bash

1 foss

2 hack

找出文件中重复的行

$sort unsorted.txt |uniq -d

hack

可以结合-s 和-w来指定键:

-s指定可以跳过前n个字符;

-w指定用于比较的最大字符数。

 

posted on 2016-12-13 11:46  gary_123  阅读(278)  评论(0编辑  收藏  举报

导航