【转】Ubuntu下cut命令的使用

本文转自: http://blog.csdn.net/geniusluzh/article/details/7010428

 

1.简介

cut命令用于从文件或者标准输入中读取内容并截取每一行的特定部分并送到标准输出。它是以每一行为一个处理对象的,这种机制和sed是一样的。

2.cut命令主要是接受三个定位方法

第一,字节(bytes),用选项-b

第二,字符(characters),用选项-c

第三,域(fields),用选项-f

3.语法

cut -c/-b list [file...]

cut -f list [-d delim] [file]          或者         cut [-d delim] -f list

-b:按字节截取方式

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who
wytzxd   tty7         2011-05-25 09:01 (:0)
wytzxd   pts/0        2011-05-25 09:34 (:0)

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who | cut -b 3                   //在-b后面必须指定数字,表示要截取哪个字节
t
t

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who | cut -b 2,3-5,10        //想要截取多个的写法 ,
ytzxt
ytzxp
但有一点要注意,cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。不能颠倒定位的顺序。

eg:

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who | cut -b 3-5,10,2         //结果与上面相同
ytzxt
ytzxp

其他:

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who | cut -b 3-                 //第三个字符以及后面所有
tzxd   tty7         2011-05-25 09:01 (:0)
tzxd   pts/0        2011-05-25 09:34 (:0)
wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who | cut -b -3                //第三个字符以及前面所有
wyt

wyt

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who | cut -b -3,3-            //第三个字符不会重复
wytzxd   tty7         2011-05-25 09:01 (:0)

wytzxd   pts/0        2011-05-25 09:34 (:0)

-c:按字符截取方式

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ who | cut -c 3,5
tx
tx

不过,看着怎么和-b没有什么区别啊?莫非-b和-c作用一样? 其实不然,看似相同,只是因为这个例子举的不好,who输出的都是单字节字符,所以用-b和-c没有区别,如果你提取中文,区别就看出来了,来,看看中文提取的情况:

(-c也是乱码,没解决)

cut -c num1-num2 filename   说明:显示每行从开头算起 num1 到 num2 的文字

who | cut -c 1-10
wytzxd   t
wytzxd   p

-f list:按字段截取

list为字段编号或一段范围的列表(以逗号隔开)

-d delim:通过-f选项,使用delim作为定界符。默认的定界符为制表符(Tab)

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cat cut_f
wang,yan,ting
wang,yan,lun
zuo,hai,zhi
wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cut -d , -f 3 cut_f                  //以逗号为分隔符
ting
lun
zhi
-b,-c 和 -f 参数可以跟以下子参数:

  N 第N个字符或字段

  N- 从第一个字符或字段到文件结束

  N-M 从第N个到第M个字符或字段

  -M 从第一个到第N个字符或字段

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cut -d , -f 1,3 cut_f > test1
wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cat test1 
wang,ting
wang,lun
zuo,zhi

注意:

1.如果遇到空格和制表符时,怎么分辨呢?

有时候制表符确实很难辨认,有一个方法可以看出一段空格到底是由若干个空格组成的还是由一个制表符组成的。

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cat cut_t
wang  yan    ting
wytzxd@ubuntu:~/Workstation/Slearn/5.25$ sed -n l cut_t                         //sed -n后面的字符是L的小写字母
wang  yan\tting$

2.我应该在cut -d中用什么符号来设定制表符或空格

默认为tab键;所以当你就是要使用制表符的时候,完全就可以省略-d选项,而直接用-f来取域。

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cut -f 1 cut_t
wang  yan
wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cut -f 2 cut_t
ting
如果你设定一个空格为间隔符,那么就这样:

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cut -f 1 -d ' ' cut_t             //两个单引号之间可确实要有一个空格
wang
wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cut -f 2 -d ' ' cut_t

wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cut -f 3 -d ' ' cut_t
yan    ting

为什么第二个例子会是空??

因为你只能在-d后面设置一个空格,不许设置多个空格,因为cut只允许间隔符是一个字符;

此例中,wang后有两个空格,所以以一个为定界符后,另一个以字符形式输出;

如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容。

 shell使用join命令将多个文件结合在一起

join [options] file1 file2 :以共同的一个键值,将已存储的文件内的记录加以结合

options:

-1:field1

-2:field2

表明要结合的字段,-1 field1指的是从file1中取出field1, -2 filed2 指的是从file2中取出field2,字段编号从1开始,而非0.

-o file.field

输出file文件中的field字段。一般的字段不打印,除非使用多个-o选项,即可显示多个输出字段。

-t separator

使用separator作为输入字段分隔字符,而非使用空白。此字符也为输出的字段分隔字符。

行为模式:

读取fiel1与file2,并根据共同键值结合多笔记录。默认以空白分隔字段。输出结果则包括共同键值、来自file1的其余记录,来自file2的其余记录。若file1为-,则join会读取标准输入。每个文件的第一个字段是用来结合的默认键值;可以使用-1与-2来更改。默认情况下,在两个文件中未含键值的行不打印。

实例:

wytzxd@ubuntu:~/Workstation/Slearn/5.29/join$ cat sales 
#业务员 数据
#业务员 量
joe    100
jane   200
herman 150
chris  300
wytzxd@ubuntu:~/Workstation/Slearn/5.29/join$ cat quotas 
#配额
#业务员 配额
joe    50
jane   75
herman 80
chris  95
wytzxd@ubuntu:~/Workstation/Slearn/5.29/join$ sed '/^#/d' quotas | sort > quotas.sorted
wytzxd@ubuntu:~/Workstation/Slearn/5.29/join$ ls
quotas  quotas.sorted  sales
wytzxd@ubuntu:~/Workstation/Slearn/5.29/join$ sed '/^#/d' sales | sort > sales.sorted
wytzxd@ubuntu:~/Workstation/Slearn/5.29/join$ ls
quotas  quotas.sorted  sales  sales.sorted
wytzxd@ubuntu:~/Workstation/Slearn/5.29/join$ join quotas.sorted sales.sorted 
chris 95 300
herman 80 150
jane 75 200
joe 50 100
posted @ 2012-06-24 16:34  午后的猫  阅读(2200)  评论(0编辑  收藏  举报