• linux的文本处理(学习笔记)


    11合并与分割

    s o r t命令的一般格式为:

    sort -cmu -o output_file [other options] +pos1 +pos2 input_files

    下面简要介绍一下s o r t的参数:

    -c 测试文件是否已经分类。

    -m 合并两个分类文件。

    -u 删除所有复制行。

    -o 存储s o r t结果的输出文件名。

    其他选项有:

    -b 使用域进行分类时,忽略第一个空格。

    -n 指定分类是域上的数字分类。

    -t 域分隔符;用非空格或t a b键分隔域。

    -r 对分类次序或比较求逆。

    +n n为域号。使用此域号开始分类。

    n n为域号。在分类比较时忽略此域,一般与+ n一起使用。

    post1 传递到m,n。m为域号,n为开始分类字符数;例如4,6意即以第5域分类,从第7个字符开始。

     

    例子:

    基本sort

    sort video.txt>results.out

    sort分类求逆

    sort -t: -r video.txt

    按指定域分类

    sort -t: +1 video.txt

    数值域分类

    sort -t: +3n video.txt

    输出结果为:

    Alien:HK:119:1982

    Boys in Company C:HK:192:2192

    The Hill:KL:63:2972

    Toy Story:HK:239:3972

    Star Wars:HK:301:4102

    Aliens:HK:532:4892

    A Few Good Men:KL:445:5851

     

    s o r t还有另外一些方法指定分类键。可以指定k选项

    sort -t: -r -k4 -k1 video.txt

    注意:k选项是从1开始计数

     

    开始以域0分类,忽略域2,然后再使用域3分类。

    sort -t: +0 -2 +3 video.txt

     

    pos用法

    + 1 . 2,意即以第1域最左边第3个字符开始分类,

    sort -t: -r +1.2 video2.txt

     

    使用headtail将输出分类

    显示最大的一行

    sort -t: -r -k4 video.txt | head -1

    显示倒数两行

    sort -t: -r -k4 video.txt | tail -2

    如果使用h e a d或t a i l时想省略显示行数,缺省时显示1 0行

     

    sort -t: -r -k4 video.txt | tail -1 |awk -F: '{print "Worst rental",$1,"has been rented "$3""}'

     

     

    系统sort

    cat /etc/passwd | sort -t: +0 |awk -F":" '{print $1}'

     

    uniq用法

    u n i q用来从一个文本文件中去除或禁止重复行

    命令一般格式:

    uniq -u d c -f input-file output-file

    -u 只显示不重复行。

    -d 只显示有重复数据行,每种重复行只显示其中一行

    -c 打印每一重复行出现次数。

    -f n为数字,前n个域被忽略。一些系统不识别- f选项,这时替代使用- n

    例子:

    # cat myfile.txt

    May Day

    May Day

    May Day

    Going Down

    May Day

    # uniq myfile.txt

    May Day

    Going Down

    May Day

    # uniq -c myfile.txt

          3 May Day

          1 Going Down

          1 May Day

    使用- d显示重复出现的不唯一行

    # uniq -d myfile.txt

    May Day

    对特定域进行测试

    使用- n只测试一行一部分的唯一性。

    # cat parts.txt

    AK123 OP

    DK122 OP

    EK999 OP

    # uniq -f1 parts.txt

    AK123 OP

    # uniq -f0 parts.txt

    AK123 OP

    DK122 OP

    EK999 OP

    Join用法

    - a 1显示第一个文件的不匹配行,- a 2为从第二个文件中显示不匹配行。

    n.m    n为文件号,m为域号。1 . 3表示只显示文件1第三域,每个n,m必须用逗号分隔,如1 . 3,2 . 1。

     

    # cat name.txt

    M.Golls 12 Hidd Rd

    P.Heller The Acre

    P.Willey 132 The Grove

    T.Norms 84 Connaught Rd

    K.Fletch 12 Woodlea

     

    # cat town.txt

    M.Golls Norwich NRD

    P.Willey Galashiels GDD

    T.Norms Brandon BSL

    K.Fletch Mildenhall MAF

     

    普通的JOIN

    # join name.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

     

    显示不匹配的行

    # join -a1 -a2 name.txt town.txt

    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

     

    以下显示相同结果

    # join -a1 name.txt town.txt

    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

     

    选择性连接

    使用- o选项选择连接域

    使用1 . 1显示第一个文件第一个域,2 . 2显示第二个文件第二个域,其间用逗号分隔。命令为:

    # join -o 1.1,2.2 name.txt town.txt

    M.Golls Norwich

    P.Willey Galashiels

    T.Norms Brandon

    K.Fletch Mildenhall

     

     

    使用-jn m进行其他域连接

    例如用文件1域3和文件域2做连接键,命令为

    # cat pers

    P.Jones Office Runner ID897

    S.Round UNIX admin ID666

    L.Clip Personl Chief ID982

     

    # cat pers2

    Dept2C ID897 6 years

    Dept3S ID666 2 years

    Dept5Z ID982 1 years

     

    # join -j1 4 -j2 2 pers pers2   无法显示,有疑问

    应该是 join -1 4 -2 2 pers pers2

     

    # join -1 4 -2 4 -o 1.1,1.2,1.3,2.1,2.2,2.3,2.4 jtxt1 jtxt2

    Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/data1/LNWASP1_QUEST_SMALL1_DATA_01.dbf

    Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/data1/LNWASP1_audits01.dbf

    Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/data1/LNWASP1_data01_01.dbf

    Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/data1/LNWASP1_index01_01.dbf

    Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/data1/LNWASP1_tools_01.dbf

    Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/data1/LNWASP1_users_01.dbf

    Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/index1/LNWASP1_sysaux02.dbf

    Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/index1/LNWASP1_sysaux03.dbf

    Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/redo1/LNWASP1_ctl_01.dbf

    Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/redo2/LNWASP1_ctl_02.dbf

    Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/redo3/LNWASP1_ctl_03.dbf

    Feb 22 14:54 Feb 22 14:58 /data/oracle/LNWASP1/rollback/LNWASP1_undotbs01.dbf

    Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/system/LNWASP1_sysaux01.dbf

    Feb 22 14:53 Feb 22 14:57 /data/oracle/LNWASP1/system/LNWASP1_system01.dbf

    Feb 22 05:06 Feb 22 05:06 /data/oracle/LNWASP1/temp/LNWASP1_temp01.dbf

    (/apps/oracle/scripts/ADHOC/DOBCPFILETSCHECK/tmp)   (/apps/oracle/scripts/ADHOC/DOBCPFILETSCHECK/tmp)  

     

    c u t用法

    用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。

    c u t一般格式为:

    cut [options] file1 file2

    下面介绍其可用选项:

    -c list 指定剪切字符数。

    -f field 指定剪切域数。

    -d 指定与空格和t a b键不同的域分隔符。

    - c用来指定剪切范围,如下所示:

    - c 1,5-7 剪切第1个字符,然后是第5到第7个字符。

    -c1-50 剪切前5 0个字符。

    -f 格式与- c相同。

    -f 1,5 剪切第1域,第5域。

    - f 1,10-12 剪切第1域,第1 0域到第1 2域。

     

    例子:

    # cut -d: -f1,6 /etc/passwd

     

    # ls -l|cut -c3-6

     

    # who -u | cut -c1-8

     

    p a s t e用法

    格式为;

    paste -d -s -file1 file2

    选项含义如下:

    -d 指定不同于空格或t a b键的域分隔符。例如用@分隔域,使用- d @。

    -s 将每个文件合并成行而不是按行粘贴。

    - 使用标准输入。例如ls -l |paste ,意即只在一列上显示输出。

     

    # paste pers pers2

    P.Jones Office Runner ID897     Dept2C ID897 6 years

    S.Round UNIX admin ID666        Dept3S ID666 2 years

    L.Clip Personl Chief ID982      Dept5Z ID982 1 years

     

    # ls -l|paste –s 按照一行粘贴

    # paste -s pers pers2

    P.Jones Office Runner ID897     S.Round UNIX admin ID666        L.Clip Personl Chief ID982

    Dept2C ID897 6 years    Dept3S ID666 2 years    Dept5Z ID982 1 years

     

     

    p a s t e命令还有一个很有用的选项( -)。意即对每一个( -),从标准输入中读一次数据。

    ls | paste -d" " - - - -

     

     

    p l i t用法

    命令一般格式:

    split -output_file-size input-filename output-filename

    这里o u t p u t - f i l e - s i z e指的是文本文件被分割的行数。s p l i t查看文件时,o u t p u t - f i l e - s i z e选项

    指定将文件按每个最多1 0 0 0行分割。

     

    tr 用法

    t r用来从标准输入中通过替换或删除操作进行字符转换。t r主要用于删除文件中控制字符或进行字符转换。使用t r时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。

    带有最常用选项的t r命令格式为:

    t r - c - d - s [ " s t r i n g 1 _ t o _ t r a n s l a t e _ f r o m " ] [ " s t r i n g 2 _ t o _ t rannsulta_t e _ t o " ] input-f i l e

    这里:

    -c 用字符串1中字符集的补集替换此字符集,要求字符集为A S C I I。

    -d 删除字符串1中所有输入字符。

    -s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。

    I n p u t - f i l e是转换文件名。虽然可以使用其他格式输入,但这种格式最常用。

     

    使用t r时,可以指定字符串列表或范围作为形成字符串的模式。这看起来很像正则表达式,但实际上不是。指定字符串1或字符串2的内容时,只能使用单字符或字符串范围或列表。

    [a-z] a-z内的字符组成的字符串。

    [A-Z] A-Z内的字符组成的字符串。

    [0-9] 数字串。

    /octal 一个三位的八进制数,对应有效的A S C I I字符。

    [O*n] 表示字符O重复出现指定次数n。因此[ O * 2 ]匹配O O的字符串。

     

    # cat oops.txt

    And the cowwwwwwwwwwwwws went homeeeeeeeeeeeee

    Or did theyyyyyyyy

     

    # tr -s "[a-z]"<oops.txt

    And the cows went home

    Or did they

    如果是替换单字符,不需要引号

    # tr -s w<oops.txt

    And the cows went homeeeeeeeeeeeee

    Or did theyyyyyyyy

     

    # cat oops.txt | tr -s "[a-z]"

    And the cows went home

    Or did they

     

    删除空行

    以下格式都可以:

    tr -s "["012]" < plane.txt

    tr -s "["n]" < plane.txt

    tr -s ['"n'] < plane.txt

    tr -s '["n]' < plane.txt

     

    转换大小写

    tr "[a-z]" "[A-Z]" <quote.txt    小写全部变大写

    tr "[a-z]" "[A-Z]" <quote.txt|tee quote4.txt quote5.txt

    cat quote.txt |tr "[:lower:]" "[:upper:]"

     

    删除指定字符

    # cat jtxt1|tr -cs "[a-z][A-Z]" "["012*]"

    去除通过ftp上传的文件的控制符号

    用t a b键替换^ ^ ^ ^ ^ ^,命令为" " 1 3 6 " " [ " 0 11 * ] "。将结果重定向到临时工作文件s t a t . t m p。

    # tr -s "["136]" "["011*]" <stat.tr > stat.tmp

    用新行替换每行末尾的^ M,并用" n去除^ Z,输入要来自于临时工作文件s t a t . t m p

    # tr -s "["015"032]" ""n" < stat.tmp

     

     

    替换p a s s w d文件中所有冒号,代之以t a b键

    # tr -s "[:]" "["011]" </etc/passwd

     

    匹配多于一个字符

    用星号代替所有的0。模式为[ 0 * 4 ],意即匹配至少4个0,替换字符串为星号

    tr "[0*4]" "*" < hdisk.txt

     

    李世侠,网名caibird2005 , initdba , 战神

    MySQL DBA经验6年;

    Oracle DBA经验10年;

    精通MySQL HA架构,复制,备份,恢复,SQL优化;

    熟悉SHELL编程、Python编程、SQL&PL/SQL编程;

    MySQL OCP课程讲师;

    ORACLE官方认证OCM证书;

    BLOG: http://www.cnblogs.com/caibird2005 

              http://www.initdba.cn 

    Wechat: caibird2005 

    TEL :+86-186-5881-5300 +86-180-7290-8651 

  • 相关阅读:
    19 C#循环语句的跳过和中断 continue和break
    18 C#中的循环执行 for循环
    一种绝对提高开发水平的方法(推荐英语)
    大数据知识普及
    全链路压测压测报告
    QuickSearch快排
    二分查找
    算法
    基于领域驱动设计的业务中台架构设计
    【科普】Scrum——从橄榄球争球到敏捷开发
  • 原文地址:https://www.cnblogs.com/caibird2005/p/1459524.html
Copyright © 2020-2023  润新知