2.9 排序、唯一与重复

《Linux Shell 脚本攻略(第 2 版)》读书笔记

sort命令既可以从特定的文件,也可以从 stdin 中获取输入,并将输出写入 stdout。

uniq的工作方式和sort一样。但要求输入的数据必须经过排序

基本用法

1. 对一组文件的内容进行排序

# 方法1
sort file1.txt file2.txt > sorted.txt

# 方法2
sort file1.txt file2.txt -o sorted.txt

# 方法3
sort file{1..2}.txt > sorted.txt

2. 按照数字顺序进行排序

sort -n file.txt

3 按照逆序进行排序

sort -r file.txt

4. 按照月份进行排序

sort -M file.txt

注意:对于 中文的月份(一月、二月、三月) 是如法进行正常排序的!

5. 合并两个已排序过的文件

sort -m sorted1 sorted2

注意:这里加上 -m 之后就不会对原文件 sorted1 sorted2 进行排序,而是只会对两个文件之间的值进行比较,从而起到提高效率的作用。

6. 对文件内容进行排序,并去除重复行

sort file1.txt file2.txt | uniq

7. 检查文件是否已经排序过

#!/bin/bash

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

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

8. 将文件排过序之后再保存到原文件中

$ sort file.txt > file.txt
# 如果执行上面这条命令的话,会导致 file.txt 文件中的内容被清空
# 如果有这个需求的话,执行下面这条命令可以正常实现功能
$ sort file.txt -o file.txt

补充内容

1. 依据键或列进行排序

将下面的文本文件排序:

$ cat data.txt
1  mac    2000
2  winxp  4000
3  bsd    1000
# 依据第1列,以逆序形式排序
$ sort -nrk 1 data.txt
4  linux  1000
3  bsd    1000
2  winxp  4000
1  mac    2000
# -nr 表明按照数字,采用逆序形式排序

# 依据第2列进行排序
$ sort -k 2 data.txt
3  bsd    1000
4  linux  1000
1  mac    2000
2  winxp  4000

将特定范围内的一组字符作为键,进行排序

$ cat data2.txt
1010stweg
5749twtld
4569nzqin

# 将每行中从第2到第4个字符作为数字进行排序
$ sort -nk 2,4 data2.txt
1010stweg
4569nzqin
5749twtld

使 sort 的输出与以\0作为定界符 xargs 命令相兼容

$ sort -z data.txt | xargs -0
# 定界符 `\0` 用来保证 xargs 命令的使用安全

忽略文件中的前导空白字符

$ cat data3.txt
a
 c
  b

$ sort -bd data3.txt
a
  b
 c
  • -b 用于忽略文件中的前导空白
  • -d 用于指明以字典序列进行排列

2. uniq

消除重复内容

$ 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

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

$ uniq -c sorted.txt
   1 bash
   1 foss
   2 hack

找出文件中重复的行

$ uniq -d sorted.txt
hack

结合-s-w来指定键

  • -s指定可以跳过前n个字符
  • -w指定用于比较的最大字符数(此选项 OS X 系统中没有)
$ cat data.txt
u:01:gnu
d:04:linux
u:01:bash
u:01:hack

$ sort data.txt | uniq -s 2 -w 2
d:04:linux
u:01:bash

删除文件中列出的所有文件

$ uniq -z file.txt | xargs -0 rm
# 这里要注意的还是 xargs 的输入必须使用`\0`作为定界符

你可能感兴趣的:(2.9 排序、唯一与重复)