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`作为定界符
网友评论