Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1325883
  • 博文数量: 268
  • 博客积分: 10698
  • 博客等级: 上将
  • 技术积分: 2867
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-14 22:21
文章分类

全部博文(268)

文章存档

2012年(19)

2011年(13)

2010年(29)

2009年(26)

2008年(99)

2007年(82)

我的朋友

分类:

2007-09-15 07:00:48

此处不过多涉及awk和sed。

一、 cut 选取列
查看所属软件包:
# dpkg -S /usr/bin/cut
coreutils: /usr/bin/cut
cut可以按字节选取列,也可以按分隔符选取列(即字段选取)。
① 按字节选取列,要用到参数-b (-c是按字符,在数字与英文中与-b效果相同)
选取从第4到第9个字节之间的列,其它的删除:
# cut -b 4-9 foo.txt
选取从第1到第13个字节之间的列,并在后面加上第19和第27列:
# cut -b 1-13,19,27 foo.txt
② 按分隔符选取列,默认中是以键为字段分隔符的。如果是其它的分隔符的话需要用参数-d来指定。例如,一个叫presidents.txt的文本文件内容为:
38|Gerald R. Ford|1974-1977|Republican
39|Jimmy Carter|1977-1981|Democrat
40|Ronald Reagan|1981-1989|Republican
41|George Bush|1989-1993|Republican
42|Bill Clinton|1993-2001|Democrat
43|George W. Bush|2001-2008|Republican
此文件用 | 为分隔符,现在在屏幕上把第二、第四段分切出来:
# cut -f2,4 -d\| presidents.txt
Gerald R. Ford|Republican
Jimmy Carter|Democrat
Ronald Reagan|Republican
George Bush|Republican
Bill Clinton|Democrat
George W. Bush|Republican
-f参数:
-f2-4 第2到第4段
-f2,4 第2、4段
-f1,7-9 第1、7、8、9段
-f -9 从第1到第9段
-f 3- 从第3到尾段
-d参数:
-d' '  以空格键为分隔符
-d\|  以 | 为分隔符
-d'|'  以 | 为分隔符



二、 paste 左右粘贴
查看所属软件包:
# dpkg -S /usr/bin/paste
coreutils: /usr/bin/paste
paste在粘多个文件的时候,不是上下粘贴,而是左右粘贴。例如,有两个文本文件num和distro:
 # cat num
1
2
3
4
5
 # cat distro
PCLinuxOS
Ubuntu
openSUSE
Fedora
Mint
# paste num distro
1    PCLinuxOS
2    Ubuntu
3    openSUSE
4    Fedora
5    Mint
默认情况下,paste会用作为分隔符,如果要指定分隔符的话:
# paste -d '-' num distro
1  -PCLinuxOS
2 -Ubuntu
3 -openSUSE
4 -Fedora
5 -Mint

下面是另外一种用法:
# paste - - < distro
PCLinuxOS       Ubuntu
openSUSE        Fedora
Mint

三、join 字段的左右粘贴
查看所属软件包:
# dpkg -S /usr/bin/join
coreutils: /usr/bin/join
合并多个文件的某些字段,合并条件是必须有相同的行标志。
 # cat file1
a ap fdl dfd
c ape dfq adadff
d af  da d
 # cat file2
a 2
b 9
c 6
d 1
# join file1 file2
a ap fdl dfd 2
c ape dfq adadff 6
d af da d 1

# join file1 file2 | join - file2
a ap fdl dfd 2 2
c ape dfq adadff 6 6
d af da d 1 1

合并第一个文件的第二列与第二个文件的第三列:
# join -o 1.2 -o 2.3 file1 file2


四、col 与 colrm  列处理
查看所属软件包:
# dpkg -S /usr/bin/col
bsdutils: /usr/bin/col
把文本中的所有都变成空格:
# cat foo | col -x
删除多列用colrm,删除第4到第11列:
# cat foo | colrm 4 11   

五、expand 把变成空格
查看所属软件包:
# dpkg -S /usr/bin/expand
coreutils: /usr/bin/expand
expand不带选项直接加参数的话与col -x功能相同:
# expand foo

六、pr 列处理
pr属于软件包coreutils
单列变多列,举例说明,有一个叫distro的文本文件:
# cat distro
PCLinuxOS
Ubuntu
openSUSE
Fedora
Mint
Sabayon
Mandriva
Debian
MEPIS
Damn Small
# pr -t -4  distro
PCLinuxOS         Fedora          Mandriva         MEPIS
Ubuntu               Mint              Debian            Damn Small
openSUSE         Sabayon
# pr -t -4 -a distro  (参数-a横着)
PCLinuxOS    Ubuntu              openSUSE        Fedora
Mint              Sabayon           Mandriva          Debian
MEPIS           Damn Small
把一个文本文件的头5列作为空白:
# pr -t -o 5 foo

七、awk与它的内置函数substr()结合起来创建字段
# cat foo
348923423
342090452
909874388
139309404
902902254
090893983
203320209
# awk '{printf substr($0,1,3)" "; print substr($0,4,length)}'  foo
348 923423
342 090452
909 874388
139 309404
902 902254
090 893983
203 320209
当然,同样的效果也可以用cut来作:
# cut -b1-3,4- --output-delimiter=" " foo

八、fold 与 fmt 限定文本宽度
它们属于软件包coreutils
fold会严格按照宽度在右边用换行符把文本切齐;
fmt会保持每个字符串的完整,所以文本的右边不会切齐,如果限定的宽度小于某个字符串长度,那么所限定的宽度无效。
# fold -w 20 foo       # 指定列数(默认值为80列)
# fold -w 10 -s foo   # 把文本限定为10列并且有空格的地方都另起一行。
# fmt -w 15 foo        # 指定列数(默认值为75列)

九、column 调整列
属于软件包bsdutils
不加参数的时候,很像上面的pr -t -4,不同的是,column会按原文的行的宽度自动确定域的数量
# column -c 70 foo   # 限定文本宽度,忽略空白行
# column -t foo      # 按字段对齐,忽略空白行

十、文本宽度的计算
# wc -L < foo                       # 实际文本宽度
# sed 's/\s*$//' foo | wc -L   #不算行尾空格或文本宽度

阅读(1725) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~