预备知识

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

实战演练

我们可以按照下面的方式轻松地对一组文件(例如file1.txt和file2.txt)进行排序:

[root@shaofeng ~]# sort out.txt sum.txt
1
1.txt
2
2.txt
3
3.txt
4
5
hello world

按照数字顺序进行排序

[root@shaofeng ~]# sort -n out.txt
1.txt
2.txt
3.txt
[root@shaofeng ~]# sort -n sum.txt
hello world
1
2
3
4
5

按照逆序进行排序

[root@shaofeng ~]# sort -r sum.txt
hello world
5
4
3
2
1

按照月份进行排序

[root@shaofeng ~]# sort -m sum.txt
1
2
3
4
5
hello world

合并两个已排序过的文件

[root@shaofeng ~]# sort -m out.txt sum.txt
1
1.txt
2
2.txt
3
3.txt
4
5
hello world

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

[root@shaofeng ~]# sort out.txt sum.txt | uniq
1
1.txt
2
2.txt
3
3.txt
4
5
hello world

检查文件是否已经排序过

[root@shaofeng ~]# ./n.sh n.txt
Unsorted
[root@shaofeng ~]# ./n.sh out.txt
Sorted
[root@shaofeng ~]# cat n.sh
#!/bin/bash

sort -C $1;
if [ $? -eq 0 ]; then
  echo Sorted;
else
  echo Unsorted;
fi

工作原理

如果文件已经排序,sort会返回为0的退出码($?),否则返回非0

补充内容

依据列或键进行排序

  • 依据第一列,以逆序形式排序,-nr表示按照数字,采用逆序形式排序
[root@shaofeng ~]# sort -nrk 1 data.txt
4 linux 2
3 bsd 1
2 winxp 2
1 mac 1
  • 依据第2列进行排序
[root@shaofeng ~]# sort -k 2 data.txt
3 bsd 1
4 linux 2
1 mac 1
2 winxp 2
  • 依据键排序,两个数字,前者表示开始位置,后者表示结束位置
[root@shaofeng ~]# sort -nk 2,3 data.txt
1010hellothis
2189ababbba
7464dfdfdfdf
[root@shaofeng ~]# sort -nrk 2,3 data.txt
7464dfdfdfdf
2189ababbba
1010hellothis

uniq

  • 重复的行只会被打印一次
[root@shaofeng ~]# sort n.txt | uniq

1
2
3
32
hi
  • 只显示唯一行(在输入文件中没有重复出现的行)
[root@shaofeng ~]# sort n.txt | uniq -u

2
3
32
hi
  • 统计各行在文件中出现的次数
[root@shaofeng ~]# sort n.txt | uniq -c
      1
      2 1
      1 2
      1 3
      1 32
      1 hi
  • 找出文件中重复的行
[root@shaofeng ~]# sort n.txt | uniq -d
1
  • 指定用于比较的最大字符数。-s:跳过指定个数的字符,然后记为开始,-w:从记为开始起,指定比较的总字符数。
[root@shaofeng ~]# cat data.txt
u:01:gnu
d:04:linux
u:01:bash
u:01:back
[root@shaofeng ~]# sort data.txt | uniq -s 2 -w 1
d:04:linux
[root@shaofeng ~]# sort data.txt | uniq -s 2 -w 2
d:04:linux
u:01:backlinux
[root@shaofeng ~]# sort data.txt | uniq -s 2 -w 3
d:04:linux
u:01:back
[root@shaofeng ~]# sort data.txt | uniq -s 2 -w 4
d:04:linux
u:01:back
u:01:gnu
[root@shaofeng ~]# sort data.txt | uniq -s 2 -w 5
d:04:linux
u:01:back
u:01:gnu
[root@shaofeng ~]# sort data.txt | uniq -s 2 -w 6
d:04:linux
u:01:back
u:01:bash
u:01:gnu

results matching ""

    No results matching ""