sort
功能说明:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序。
sort [-bcdfimMnr][-o][-t][+-][--help][--verison][文件]
-b 忽略每行前面开始处的空格字符 。
-c 检查文件是否已经按照顺序排序。
-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
-f 排序时,将小写字母视为大写字母。
-i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
-m 将几个排序好的文件进行合并。
-M 将前面3个字母依照月份的缩写进行排序。
-n依照数值的大小排序。
-o 将排序后的结果存入指定的文件。
-r以相反的顺序来排序。
-t 指定排序时所用的栏位分隔字符。
-k 选择以哪个区间进行排序
+- 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
源文件
默认排序
举栗
举栗
banana
apple
pear
orange
apple
pear
1
2
10
1
10
2
apple
apple
banana
orange
pear
pear
-u 在输出行中去除重复行。
1
10
2
apple
banana
orange
pear
-b 忽略每行前面开始处的空格字符。
cat space.txt
cat space1.txt
aaa
nn
tt
3
11
aaa
nn
tt
3
11
sort space.txt
sort space1.txt
sort -b space.txt
aaa
nn
3
tt
11
11
3
aaa
nn
tt
11
3
aaa
nn
tt
-o 把排序结果输出到原文件中
使用重定向:
sort test.txt>test.txt 后
test.txt为空
sort test.txt -o test.txt
cat test.txt
1
10
2
apple
apple
banana
orange
pear
pear
-t 指定排序时所用的栏位分隔字符。
-k 选择以哪个区间进行排序
cat date.txt
2017-12-02
2017-01-09
2017-10-23
2017-04-24
sort -n -k 2 -t'-' date.txt
2017-01-09
2017-04-24
2017-10-23
2017-12-02
-n 依照数值的大小排序。
sort -n test.txt
apple
apple
banana
orange
pear
pear
1
2
10
sort 默认情况下会将数字按照字符串来排序,
所以会出现2比10大的情况。使用-n能避免该情况
-c 检查文件是否已经按照顺序排序
sort -c 排好序的文件,无返回信息,echo $?为0
sort -c 未排序文件,有提示信息,echo $?为1
-r 以相反的顺序来排序
cat test.txt
1
11
2
34
sort -n -r test.txt
34
11
2
1
uniq
[-cdu][-f][-s][-w][--help][--version][输入文件][输出文件]
-u或--unique 只保留出现唯一一次的行列。
-d或--repeated 仅显示重复出现的行列,出现一次的行列不会显示
-c 在每列旁边显示该行重复出现的次数。
-f n 或--skip-fields=n 忽略前N个字段。字段由空白字符(空格符、Tab)分隔
-s或--skip-chars= 忽略比较指定的字符。-s n:忽略前n个字符,从n+1个字符开始比较
-w或--check-chars= 指定要比较的字符。-w n:只比较前n个字符,对每行第n个字符以后的内容不作对照
-i, --ignore-case在比较的时候不区分大小写
[输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;
[输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。
uniq 是对排序好的内容去重当重复的行并不相邻时,uniq 命令是不起作用的,所以需要先使用sort排序,在使用uniq去重
举栗:
原文件
默认去重
仅显示出现一次的行 -u
e bsd 1000 600 4M
c Debian 600 200 8K
b linux 1000 200 5K
a mac 2000 500 2K
f SUSE 4000 300 6M
c win7 2000 100 7G
d winxp 4000 300 3G
d winxp 500 300 3G
g winxp 500 300 3G
g winxp 500 300 3G
G WINXP 500 300 3G
uniq -c test_uniq.txt
1 e bsd 1000 600 4M
1 c Debian 600 200 8K
1 b linux 1000 200 5K
1 a mac 2000 500 2K
1 f SUSE 4000 300 6M
1 c win7 2000 100 7G
1 d winxp 4000 300 3G
1 d winxp 500 300 3G
2 g winxp 500 300 3G
1 G WINXP 500 300 3G
uniq -u -c test_uniq.txt
1 e bsd 1000 600 4M
1 c Debian 600 200 8K
1 b linux 1000 200 5K
1 a mac 2000 500 2K
1 f SUSE 4000 300 6M
1 c win7 2000 100 7G
1 d winxp 4000 300 3G
1 d winxp 500 300 3G
1 G WINXP 500 300 3G
不显示出现多次的行
仅显示重复出现的行 -d
比较的时候不区分大小写 -i
uniq -d -c test_uniq.txt
2 g winxp 500 300 3G
不显示只出现一次的行
uniq -i -c test_uniq.txt
1 e bsd 1000 600 4M
1 c Debian 600 200 8K
1 b linux 1000 200 5K
1 a mac 2000 500 2K
1 f SUSE 4000 300 6M
1 c win7 2000 100 7G
1 d winxp 4000 300 3G
1 d winxp 500 300 3G
3 g winxp 500 300 3G
不区分大小写,所以有三行进行的合并
比较时忽略前n个字段,从n+1列开始比较 -f n
比较时忽略前n个字符,从n+1个字符开始比较 -s n
uniq -c -f 3 test_uniq.txt
1 e bsd 1000 600 4M
1 c Debian 600 200 8K
1 b linux 1000 200 5K
1 a mac 2000 500 2K
1 f SUSE 4000 300 6M
1 c win7 2000 100 7G
1 d winxp 4000 300 3G
4 d winxp 500 300 3G
源文件
注意空格符
a b 30 3G
a h 30 3G
a g 30 3G
a ffff 30 3G
uniq -c -f 2 test.txt
1 a b 30 3G
1 a h 30 3G
2 a g 30 3G
忽略前2个字段时,前2个字段中的字符以及空格不同都不会有影响,但是第2个字段之后的空格与字符变化会影响去重效果
uniq -c -s 1 test_uniq.txt
1 e bsd 1000 600 4M
1 c Debian 600 200 8K
1 b linux 1000 200 5K
1 a mac 2000 500 2K
1 f SUSE 4000 300 6M
1 c win7 2000 100 7G
1 d winxp 4000 300 3G
3 d winxp 500 300 3G
1 G WINXP 500 300 3G
忽略前1个字符,
d winxp 500 300 3G跟g winxp 500 300 3G会被认为是一样的
只比较前n个字符,对每行第n个字符以后的内容不作对照 -w n
指定输出文件
uniq -c -w 1 test_uniq.txt
1 e bsd 1000 600 4M
1 c Debian 600 200 8K
1 b linux 1000 200 5K
1 a mac 2000 500 2K
1 f SUSE 4000 300 6M
1 c win7 2000 100 7G
2 d winxp 4000 300 3G
2 g winxp 500 300 3G
1 G WINXP 500 300 3G
uniq -c test_uniq.txt out.txt
cat out.txt
1 e bsd 1000 600 4M
1 c Debian 600 200 8K
1 b linux 1000 200 5K
1 a mac 2000 500 2K
1 f SUSE 4000 300 6M
1 c win7 2000 100 7G
1 d winxp 4000 300 3G
1 d winxp 500 300 3G
2 g winxp 500 300 3G
1 G WINXP 500 300 3G
默认去重,将去重结果保存到out.txt