导论
sort是shell编程里排序的首选,它将输入行按参照键值和数据类型,以locale排序。
sort后经常面临去重的需求,接着介绍uniq的用法。
最后,提一下wc字数统计工具的用法。
sort和uniq都是管道命令
sort用法
command
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
----------------------------------------------------------------------
对连续且相同的记录去重,只保留一行,写入标准输出
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算上换行符;
阅读(1353) | 评论(0) | 转发(0) |