《LInux与Unix Shell编程指南》笔记之合并与分割

来源:互联网 发布:frontpage软件 编辑:程序博客网 时间:2024/05/23 16:02
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]为文件名剩余部分顺序
字符组合。