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
原文地址:https://www.cnblogs.com/lfjn/p/11401277.html