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指定用于比较的最大字符数。