1. uniq用来从一个文本文件中去除或禁止重复行。一般u n i q假定文件已分类,并且结果正确。
我们并不强制要求这样做,如果愿意,可以使用任何非排序文本,甚至是无规律行。
可以认为u n i q有点像s o r t命令中唯一性选项。
选项:
-c 在输出行前面加上每行在输入文件中出现的次数。
-d 仅显示重复行。
-f Fields 忽略由 Fields 变量指定的字段数目。 如果 Fields 变量的值超过输入行中的字段数目, uniq 命令用空字符串进行比较。 这个标志和 -Fields 标志是等价的。
-u 仅显示不重复的行。
-s Characters 忽略由 Characters 变量指定的字符的数目。 如果 Characters 变量的值超过输入行中的字符的数目, uniq 用空字符串进行比较。 如果同时指定 -f 和 -s 标志, uniq 命令忽略由 -s Characters 标志指定的字符的数目,而从由 -f Fields 标志指定的字段后开始。
field的编号是从1开始计数。
1》
along@along-laptop:~/code/shell/sort$ cat myfile
May Day
May Day
May Day
Going Down
May Day
along@along-laptop:~/code/shell/sort$ uniq -f0 myfile
May Day
Going Down
May Day ;忽略前0域,相当于不忽略
along@along-laptop:~/code/shell/sort$ uniq -f1 myfile
May Day
Going Down
May Day ;忽略前一个域
along@along-laptop:~/code/shell/sort$ uniq -f2 myfile
May Day ;忽略前两个域
along@along-laptop:~/code/shell/sort$ uniq -f3 myfile
May Day ;指定的域越界了,所以此时比较空字符串。认为文件全部是重复的。
2》
along@along-laptop:~/code/shell/sort$ cat myfile
May Day
May Day
May Day
Going way
May Day
along@along-laptop:~/code/shell/sort$ uniq -f1 myfile
May Day
Going way
May Day ;忽略前一域
along@along-laptop:~/code/shell/sort$ uniq -f1 -s2 myfile
May Day ;忽略前一域,和中间的空格,以及第二域的开始一个字符的、相当于只剩下ay
2.Join
这里有两个文件file1和file2,当然已经分类。每个文件里都有一
些元素与另一个文件相关。由于这种关系, join将两个文件连在一起,这有点像修改一个主文
件,使之包含两个文件里的共同元素。文本文件中的域通常由空格或tab键分隔,但如果愿意,可以指定其他的域分隔符。
文件names:
M.Golls 12 Hidd Rd
P.Heller The Acre
P.Willey 132 the Grove
T.Norms 84 Connaught Rd
K.Fletch 12 Woodlea
文件towm:
M.Golls Norwich NRD
P.Willey Galashiels GDD
T.Norms Brandon BSL
K.Fletch Mildenhall MAF
kkkkkkkkkkkkkk
along@along-laptop:~/code/shell/sort$ join names towm
M.Golls 12 Hidd Rd Norwich NRD
P.Willey 132 the Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
合并两个文件。默认的是按照第一域进行合并。
along@along-laptop:~/code/shell/sort$ join -a1 names towm
M.Golls 12 Hidd Rd Norwich NRD
P.Heller The Acre
P.Willey 132 the Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
在显示合并结果的同时显示文件1中的不匹配行
along@along-laptop:~/code/shell/sort$ join -a1 -a2 names towm
M.Golls 12 Hidd Rd Norwich NRD
P.Heller The Acre
P.Willey 132 the Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
kkkkkkkkkkkkkk
同时显示文件1和文件2中的不匹配行
along@along-laptop:~/code/shell/sort$ join -o 1.2 2.3 names towm
12 NRD
132 GDD
84 BSL
12 MAF
连接文件1的第二部分,文件2的第三部分。
前提是这两行的域一要匹配。
along@along-laptop:~/code/shell/sort$ join -j1 2 -j2 3 names towm
将文件一的第二域和文件2的第3域进行匹配连接。这里结果为空,这是因为文件1的第二域和文件2的第三域找不到可以匹配的行。
现在将这两个文件稍作修改:
along@along-laptop:~/code/shell/sort$ cat names
M.Golls 12 Hidd Rd
pp ppp ppp pppp
P.Willey 132 the Grove
T.Norms 84 Connaught Rd
K.Fletch 12 Woodlea
along@along-laptop:~/code/shell/sort$ cat towm
M.Golls Norwich 12
P.Willey Galashiels 132
T.Norms Brandon 84
K.Fletch Mildenhall 12
kkkkkkkkkkkkkk
along@along-laptop:~/code/shell/sort$ join -j1 2 -j2 3 names towm
12 M.Golls Hidd Rd M.Golls Norwich
注意看到names的第二行现在变了,不能和towm的第二行找到匹配,造成下边的都无法找到匹配。所以结果只有一行。
along@along-laptop:~/code/shell/sort$ cat names
M.Golls 12 Hidd Rd
ppppppppppp
P.Willey 132 the Grove
T.Norms 84 Connaught Rd
K.Fletch 12 Woodlea
along@along-laptop:~/code/shell/sort$ join -j1 2 -j2 3 names towm
12 M.Golls Hidd Rd M.Golls Norwich
132 P.Willey the Grove P.Willey Galashiels
84 T.Norms Connaught Rd T.Norms Brandon
12 K.Fletch Woodlea K.Fletch Mildenhall
现在注意看names的第二行根本就不存在域2,所以匹配时会将这一行忽略。继续匹配下边的各行。所以结果有四行。
参考文件《Linux 和 Unix shell 编程指南》
阅读(728) | 评论(0) | 转发(0) |