zoukankan      html  css  js  c++  java
  • shell脚本--cut命令

     选项说明                        

    cut命令将行按指定的分隔符分割成多列,它的弱点在于不好处理多个分隔符重复的情况,因此经常结合tr的压缩功能。

    -b:按字节筛选;
    -n:与"-b"选项连用,表示禁止将字节分割开来操作;
    -c:按字符筛选;
    -f:按字段筛选;
    -d:指定字段分隔符,不写-d时的默认字段分隔符为"TAB";因此只能和"-f"选项一起使用。
    -s:避免打印不包含分隔符的行;
    --complement:补足被选择的字节、字符或字段(反向选择的意思或者说是补集);
    --output-delimiter:指定输出分割符;默认为输入分隔符。

    假设/tmp/abc.sh中下面所示的内容。注意:第2行到第5行每列不是都以单个空格分隔的,有的地方重复了几个空格,有的地方只有一个空格,也就是说,文本内容不是很规则。并且最后一行完全没有空格。

    下面是cut的示例。

    在abc.sh中有5个字段。筛选出第二字段name列和第4字段mark列。使用空格作为分隔符。

    [root@localhost ~]# cut -d" " -f2,4 abc.sh
    Name Mark
     001
     
     001
     
     
    djakldj;lajd;sla

    可以看到,输出的是乱七八糟的非预期结果。原因就是分隔符空格在分隔的地方重复了多次。所以想要正确显示结果,需要把重复空格处理掉。

    可以使用tr工具来压缩连续字符。

    [root@localhost ~]# cat abc.sh | tr -s " " | cut -d " " -f2,4
    Name Mark
    longshuai 56
    gaoxiaofang 60
    zhangsan 50
    lisi 80
    wangwu 90
    djakldj;lajd;sla

    但是输出中的最后一行中完全没有定界符的行也输出了,这需要使用-s来取消这样的输出。

    [root@localhost ~]# cat abc.sh | tr -s " " | cut -d" " -f2,4 -s
    Name Mark
    longshuai 56
    gaoxiaofang 60
    zhangsan 50
    lisi 80
    wangwu 90

    使用--complement                          

    输出除了第2字段和第4字段其余的所有字段。

    [root@localhost ~]# cat abc.sh | tr -s " " | cut -d" " -f2,4 -s --complement
    NO SubjectID 备注
    1 001 不及格
    2 001 及格
    3 001 不及格
    4 001 及格
    5 001 及格

    按字节或字符分割                            

    英文和阿拉伯数字是单字节字符,中文是双字节字符,甚至是3字节字符。

    使用-b来按字节筛选,使用-c按字符分割。

    注意,按字节或字符分割时将不能指定-d,因为-d是划分字段的。

    [root@localhost ~]# cut -b1-5 abc.sh 
    NO Na
    1  lo
    2  ga
    3  zh
    4  li
    5  wa
    djakl

    由于筛选中文,结果中出现乱码。

    [root@localhost ~]# cut -b20 abc.sh  
    a
    6
     
    
    
     0

    所以"-b"选项需要结合"-n"选项,以禁止"-b"选项将多字节的字符强行分割导致乱码。

    [root@localhost ~]# cut -n -b20 abc.sh
    a
    60

    也可以按字符分隔。

    [root@localhost ~]# cut -c20 abc.sh    
    a
    60

    使用--output-delimiter                        

    使用"--output-delimiter"指定输出分隔符。

    使用-b或者-c分隔了多段字符时,可以使用--output-delimiter,否则这些多段将拼接在一起。

    [root@localhost ~]# cut -b3-5,6-8 abc.sh 
     Name 
     longs
     gaoxi
     zhang
     lisi 
     wangw
    akldj;
    [root@localhost ~]# cut -b3-5,6-8 abc.sh --output-delimiter "," 
     Na,me 
     lo,ngs
     ga,oxi
     zh,ang
     li,si 
     wa,ngw
    akl,dj;

    cut中的范围指定                            

    可以使用"N-"、"N-M"和"-M"分别表示每行N字符(或字节或字段)后的所有内容、N-M段内容和M段之前的内容。注意包括N和M的边界。

    [root@localhost ~]# cut -d" " -f3- abc.sh -s 
    SubjectID Mark 备注
    longshuai 001  56 不及格
    gaoxiaofang  001 60 及格
    zhangsan 001 50 不及格
    lisi    001   80 及格
    wangwu   001   90 及格

    范围交叉时,不会重复输出。比如-f3-5,4-6,则输出-f3-6。

    [root@localhost ~]#  cut -d" " -f3-5,4-6 abc.sh -s
    SubjectID Mark 备注
    longshuai 001  56
    gaoxiaofang  001 60
    zhangsan 001 50 不及格
    lisi   
    wangwu   001

    如果范围顺序无序,则Linux会先对范围排序(升序)再输出。例如-f4-6,2等价于-f2,4-6。

    [root@localhost ~]# cut -d" " -f4-6,2 abc.sh -s 
    Name Mark 备注
     001  56
      001 60
     001 50 不及格
       
       001

     

  • 相关阅读:
    python2与3自由切换
    ubuntu 安汉google浏览器
    ros 下常用的依赖库
    imu tool使用
    g2o 初始化
    linux 解压缩
    sudo apt-get update 没有公钥,无法验证下列签名
    ceres g2o 安装
    ubuntu 下开源安装
    Nhibernate中 Many-To-One 中lazy="proxy" 延迟不起作用的原因
  • 原文地址:https://www.cnblogs.com/liujunjun/p/12005966.html
Copyright © 2011-2022 走看看