sort是shell编程里排序的首选,它将输入行按参照键值和数据类型,以locale排序。
sort后经常面临去重的需求,接着介绍uniq的用法。
最后,提一下wc字数统计工具的用法。
sort后经常面临去重的需求,接着介绍uniq的用法。
最后,提一下wc字数统计工具的用法。
sort和uniq都是管道命令
sort用法
command
- sort option input_files
sort将input_files顺次读入,默认按照ASCII顺序排序记录,输出到stdout。
Write sorted concatenation of all FILE(s) to standard output.
选项(较重要的)
-t 默认用空白间隔字段,并按照第一字段为参照键值进行排序,-t指定分隔符;
-k 配合-t使用,指定排序的参照键值范围,-kn.m,p.q,即指定第n个字段的第m个字符开始,到第p个字段的第q个字符为止;
-r 反序;
-c 检查是否排序,若是文件是乱序的,返回值为非0
-n 数字排序
-u 去重,只输出一次相同键值的记录
举例
-t,-k:指定字段排序
- $ sort -t':' -k3,3 /etc/passwd #用uid排序,注意排序顺序
- #等效 sort -t ':' -k3 /etc/passwd
- uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
- pegasus:x:100:500:tog-pegasus OpenPegasus WBEM/CIM services:/var/lib/Pegasus:/sbin/nologin
- operator:x:11:0:operator:/root:/sbin/nologin
- games:x:12:100:games:/usr/games:/sbin/nologin
- gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
- ftp:x:14:50:FTP User:/:/sbin/nologin
- daemon:x:2:2:daemon:/sbin:/sbin/nologin
- nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
-k:组合字段排序
- $ sort -t':' -k 1.2,1.3 /etc/passwd #用第一个字段username的第二个字符和第三个字符排序
- ma:x:527:528::/home/ma:/bin/bash
- daemon:x:2:2:daemon:/sbin:/sbin/nologin
- baiy:x:515:517::/home/baiy:/bin/bash
- mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
- mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
-k:指定字符范围排序
-n:用数字排序
- $ sort -t':' -k3n -k4n /etc/passwd|less #先用uid排序,再用gid排序,注意这里按照数字排序
- landscape:x:102:108::/var/lib/landscape:/bin/false
- sshd:x:103:65534::/var/run/sshd:/usr/sbin/nologin
- postgres:x:104:113:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
- mysql:x:105:114:MySQL Server,,,:/var/lib/mysql:/bin/false
- work:x:1000:1000:work,,,:/home/work:/bin/bash
-u:去重记录
注意:uniq也可以达到一样的效果,稍后介绍
- $ sort -u sort.txt #sort去重,去重以整条记录为单位
- ---- #inputfile
- sort.txt
- aber 200
- aber 200
- aber 200
- aber 201
- aber 400
- ---- #output
- aber 200
- aber 201
- aber 400
-r:反序,不多赘述。
sort不稳定
#相同的顺序输入记录是否输出也保持原样?
-
$ sort -t'_' -k1,1 -k2,2 <
#here-document可以视作一个文件 - > o_t
- > o_t_three
- > o_t_four
- > o_t_five
- > EOF
- o_t
- o_t_five
- o_t_four
- o_t_three
----------------------------------------------------------------------
uniq用法
command
- uniq option input_files
对连续且相同的记录去重,只保留一行,写入标准输出
Discard all but one of successive identical lines from INPUT (or standard input), writing to OUTPUT (or standard output).
举例
默认行为:uniq不会把所有的行去重,只会去重连续相同的行。
- $ uniq uniq.txt
- tres
- unus
- duo
- tres
- duo
- tres
配合sort:因此要配合sort,先把相同的记录归并在一起,去重
- $ sort uniq.txt | uniq
- duo
- tres
- unus
-c计数:在每个输出前加上重复的次数
- $ sort uniq.txt | uniq -c
- 4 duo
- 3 tres
- 1 unus
-d显示重复的行:只显示重复的行
- $ sort uniq.txt | uniq -d
- duo
- tres
-u显示从未重复的行:在取单值时候非常有效
- $ sort uniq.txt | uniq -u
- unus
-i不区分大小写,暂不举例
样例文件
- $ cat uniq.txt
- tres
- unus
- duo
- duo
- duo
- tres
- duo
- tres
-----------------------------------
wc用法
command
wc读入一批文件,产出字数报告,顺序产出-l(行数),-w(单词字数),-c(字节数:通常就是字符数)
- $ wc uniq.txt
- 9 9 40 uniq.txt
- #行数 词数 字节数
- $ ls -l uniq.txt
- -rw-rw-r-- 1 lordzzr lordzzr 40 Dec 30 15:53 uniq.txt #字节数和文件大小是一致的
其中,换行符也算在里面:
- $ echo abc | wc -c
- 4 #隐含了'\n'
- $ echo -n abc | wc -c
- 3
awk关于wc的一种实现:(见awk篇)
- $ awk '{count+=length($0)+1;word+=NF } END{ print NR , word , count }' plain.txt
- #length($0)计算整个行的字符数,+1算上换行符;