合并与分割
点击打开本章pdf文档 uniq用法
作用:从一个文本文件中去除或禁止重复行。
uniq与sort命令中唯一性选项的区别:其中,前者去除连续不断出现的行,保留一个;后者去除所有重复行,保留一
个。
uniq格式:
uniq -u d c -f input-file output-file
含义:
-u 只显示不重复行
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数
-f n为数字,前n个域被忽略
注意:一些系统不识别-f选项,这时替代使用-n。
下面用例子演示上面的选项:
a、创建文件myfile.txt,内容为:
[root@localhost test]# cat myfile.txt
May Day
May Day
May Day
Going Down
May Day
b、去除连续出现的重复行:
[root@localhost test]# uniq myfile.txt
May Day
Going Down
May Day
记住,是连续出现的。
c、
[root@localhost test]# uniq -u myfile.txt
Going Down
May Day
上面这段命令的结果的意思是说,存在有字符串Going Down和May Day没有连续出现的情况。虽然myfile.txt的
前3行都是May Day但是第5行的May Day没有连续出现。
d、
[root@localhost test]# uniq -c myfile.txt
3 May Day
1 Going Down
1 May Day
上面使用-c选项显示每个重复行数目。
e、
[root@localhost test]# uniq -d myfile.txt
May Day
上面的-d用来显示重复出现的不唯一行,意思就是说哪些内容是有连续出现的。在这里May Day连续重复出现3次。
f、下面来测试特定域 进行测试-f选项:
创建文本parts.txt,内容为:
[root@localhost test]# cat parts.txt
AK123 OP
DK122 OP
EK999 OP
现在如果测试第1域,则uniq会比较三个相同的OP,因此将返回一行:
[root@localhost test]# uniq -f2 parts.txt
AK123 OP
如故'-f'返回错误,替代使用:
[root@localhost test]# uniq -n2 parts.txt
AK123 OP
join用法:
作用:将来自两个分类文本文件的行连在一起。
工作方式:前提是两个文本文件已经分类,里面都有一些元素与另一个文件相关,join就是通过这个相关的内容连在
一起的。文本文件中的域通常由空格或tab键分隔,也可以用其他的分隔符。
格式为:
join [options] input_file1 input_file2
options内容:
an n为数字,用来连接时从文件n中显示不匹配行。如-al显示第一个文件的不匹配行。
o n.m n为文件号,m为域号。如,1.3表示只显示文件1第三域。每个n.m组合中必须用都好分隔,如1.3,2.1。
j n m n为文件号,m为域号。使用其他域作连接域。
t 域分隔符。例如,指定冒号做域分隔符-t:。
注意,这里的域从1开始算。
下面进行测试。
先准备两文档names.txt,内容为:
[root@localhost test]# cat names.txt
M.Golls 12 HIdd Rd
P.Heller The Acre
P.Willey 132 The Grove
T.Norms 84 Connaught Rd
K.Fletch 12 Woodlea
文档town.txt:
[root@localhost test]# cat town.txt
M.Golls Norwich NRD
P.Willey Galashiels GDD
T.Norms Brandon BSL
K.Fletch MIldenhall MAF
a、先观察两个文件有相同内容的域0,连接两个文件:
[root@localhost test]# join names.txt town.txt
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
b、选择性连接:
使用-o选项,例如使用1.1显示第一个文件第一个域,2.2显示第二个文件第二个域,记住用逗号隔开:
[root@localhost test]# join -o 1.1,2.2 names.txt town.txt
M.Golls Norwich
P.Willey Galashiels
T.Norms Brandon
K.Fletch MIldenhall
c、使用-jn m进行其他域进行连接,在这里要在连接的两个文件中找到作为连接键的域,命令为:
join -jn m -jn m file1 file2
例如:
[root@localhost test]# join -j1 1 -j2 1 names.txt town.txt
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
上面这个是用文件1的域1和文件2的域1作为连接键。
cut命令
作用:用来从标准输入或文本文件中剪切列或域。可以与粘贴命令一起使用。
格式为:
cut [options] file1 file2
介绍:
-c 指定剪切的字符数
-f 指定剪切域数
-d 指定与空格和tab键不同的域分隔符
-c的格式为:
-c1,5-7 剪切第1个字符,然后是第5到第7个字符
-c1-50 剪切前50个字符
-f的格式与-c的格式相同:
-f1,5 剪切第1域,第5域。
-f1,10-12 剪切第1域,第10到12域。
下面测试一下:
修改pers文件为:
[root@localhost test]# cat pers
P.Jones:Office Runner:ID897
S.Round:UNIX admin:ID666
L.Clip:Personal Chief:ID982
以下的内容都是以":"作为域分隔符。
a、剪切指定域:
[root@localhost test]# cut -d: -f1,3 pers
P.Jones:ID897
S.Round:ID666
L.Clip:ID982
b、剪切指定字符数
[root@localhost test]# cut -c1-5 pers
P.Jon
S.Rou
L.Cli
可以发现,在剪切指定域的时候要指出域分隔符,而剪切指定字符时不用。
paste用法:
cut用来从文本文件或标准输出中抽取数据列或者域,然后再用paste可以将这些数据粘贴起来形成相关文件。粘贴两
个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。
paste将按行将不同文件行信息放在一行。缺省情况下,paste连接时,用空格或tab键分隔新行中不同文本,除非指
定 -d选项,它将成为域分隔符。
格式为:
paste -d -s file1 file2
解释:
-d 指定不同于空格或tab键的域分隔符。
-s 将每个文件合并成行来粘贴。
示例:
创建两个文件pas1:
[root@localhost test]# cat pas1
ID897
ID666
ID982
和文件pas2:
[root@localhost test]# cat pas2
P.Jones
S.Round
L.Clip
a、将两文件粘贴成两列:
[root@localhost test]# paste pas1 pas2
ID897 P.Jones
ID666 S.Round
ID982 L.Clip
注意,如上所示,默认用空格作为分隔域。还有就是pas1和pas2谁排前面就先粘贴谁,可以修改为:
[root@localhost test]# paste pas2 pas1
P.Jones ID897
S.Round ID666
L.Clip ID982
b、逐个文件粘贴成行,使用-s选项,如:
[root@localhost test]# paste -s pas1 pas2
ID897 ID666 ID982
P.Jones S.Round L.Clip
命令结果的的一行为文件pas1的内容,第二行为文件pas2的内容。
split命令
作用:将大文件分割成小文件。格式为:
split -output_file-size input-filename output-filename
其中output_file-size是文本文件被分割的行数。
例如:
创建文件split1,内容为:
[root@localhost test]# cat split_1
this is line1
this is line2
this is line3
this is line4
this is line5
this is line6
现在按每个文件2行分割,命令为:
[root@localhost test]# split -2 split_1
然后查看文件,多了一下三个文件:xaa、xab、xac。
可以查看内容,例如:
[root@localhost test]# cat xaa
this is line1
this is line2
注意:默认以后分割出来的小文件的命名方式为x[aa]到x[zz],x为文件名首字母,[aa]、[zz]为文件名剩余部分顺序
字符组合。