【转】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$ whowytzxd 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,5tx
tx
不过,看着怎么和-b没有什么区别啊?莫非-b和-c作用一样? 其实不然,看似相同,只是因为这个例子举的不好,who输出的都是单字节字符,所以用-b和-c没有区别,如果你提取中文,区别就看出来了,来,看看中文提取的情况:
(-c也是乱码,没解决)
cut -c num1-num2 filename 说明:显示每行从开头算起 num1 到 num2 的文字
who | cut -c 1-10wytzxd t
wytzxd p
-f list:按字段截取
list为字段编号或一段范围的列表(以逗号隔开)
-d delim:通过-f选项,使用delim作为定界符。默认的定界符为制表符(Tab)
wytzxd@ubuntu:~/Workstation/Slearn/5.25$ cat cut_fwang,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_twang 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
如果你设定一个空格为间隔符,那么就这样:
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