zoukankan      html  css  js  c++  java
  • cut命令

    参考资料:博客园骏马金龙https://www.cnblogs.com/f-ck-need-u/p/7521357.html

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

    注意:cut分隔符必须是单个字符

    cut命令的常用选项

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

    cut命令的简单案例

    fie.txt

    NO Name     Mark 备注
    1  zhangsan 50   不及格
    2  lisi     80   良好
    3  wangwu   90   优秀
    a,b,c,d

    1、按字段筛选。输出第一列和第三列

    [root@linux test]# cut -f1,3 -d ' ' file.txt
    NO
    1 zhangsan
    2 lisi
    3 wangwu
    a,b,c,d
    [root@linux test]#

    遇到的问题:cut把1个空格当做了1个字符,导致实际情况和预计情况不符。

    解决方法:使用tr命令压缩连续字符

    [root@linux test]# cat file.txt | tr -s ' ' | cut -d ' ' -f1,3
    NO Mark
    1 50
    2 80
    3 90
    a,b,c,d

    还有一个问题:a,b,c,d 不符合格式规范,怎么也输出了。

    解决方法:使用-s选项。 -s:避免打印不包含分隔符的行。

    [root@linux test]# cat file.txt | tr -s ' ' | cut -d ' ' -f1,3 -s
    NO Mark
    1 50
    2 80
    3 90

    2、输出 除 第一列和第三列 外的所有列。

    [root@linux test]# cat file.txt | tr -s ' ' | cut -d ' ' -f1,3 -s --complement
    Name 备注
    zhangsan 不及格
    lisi 良好
    wangwu 优秀

    3、按字节或字符筛选。使用-b来按字节筛选,使用-c按字符筛选。

    英文和阿拉伯数字是单字节字符,中文是双字节字符,甚至是3字节字符(根据编码而定)。

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

    [root@linux test]# cut -b1-20 file.txt
    NO Name      Mark ▒
    1  zhangsan  502  lisi      803  wangwu    90   ▒
    a,b,c,d

    遇到的问题:中文乱码

    解决方法:"-b"选项结合"-n"选项,以禁止"-b"选项将多字节的字符强行分割导致乱码。

    [root@linux test]# cut -n -b1-20 file.txt
    NO Name      Mark 备注
    1  zhangsan  50   不及
    2  lisi      80   良好
    3  wangwu    90   优秀
    a,b,c,d

    另外一种解决方法:按字符分隔

    [root@linux test]# cut -c1-20 file.txt
    NO Name      Mark 备注
    1  zhangsan  50   不及
    2  lisi      80   良好
    3  wangwu    90   优秀
    a,b,c,d

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

    [root@linux test]# cut -b1-7,8-18 file.txt
    NO Name      Mark
    1  zhangsan  50
    2  lisi      80
    3  wangwu    90
    a,b,c,d
    [root@linux test]# cut -b1-7,8-18 file.txt --output-delimiter=','
    NO Name,      Mark
    1  zhan,gsan  50
    2  lisi,      80
    3  wang,wu    90
    a,b,c,d

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

    [root@linux test]# cut -c3- file.txt
     Name      Mark 备注
     zhangsan  50   不及格
     lisi      80   良好
     wangwu    90   优秀
    b,c,d
    [root@linux test]# cut -c3-9 file.txt
     Name
     zhangs
     lisi
     wangwu
    b,c,d
    [root@linux test]# cut -c-9 file.txt
    NO Name
    1  zhangs
    2  lisi
    3  wangwu
    a,b,c,d

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

    [root@linux test]# cut -d ' ' -f2-5,4-6 file.txt
    Name
     zhangsan  50
     lisi
     wangwu
    a,b,c,d
  • 相关阅读:
    关于jQuery动态多次绑定的问题及解决
    零基础英文盲打的建议
    29道Java简答题
    Redis分布式锁的实现(纯文字)
    小程序三级联动(动态获取数据)
    sql中按in中的ID进行排序输出
    layui中对表格操作按钮集的判断
    Linq改进
    C#前台直接调用后台数据时,<p>或双引号出现转义的问题
    sql 中sum函数返回null的解决方案
  • 原文地址:https://www.cnblogs.com/lfjn/p/11401277.html
Copyright © 2011-2022 走看看