此处不过多涉及awk和sed。
一、 cut 选取列查看所属软件包:
# dpkg -S /usr/bin/cutcoreutils: /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) |