下面这个例子中,字段都是固定宽度的,但没有使用字段分隔符。substr函数可以用来创建字段。
范例
031291ax5633 ( 408 ) 987 -0124
021589bg2435 ( 415 ) 866 - 1345
122490de1237 ( 916 ) 933 - 1234
010187ax3458 ( 408 ) 264 - 2546
092491bd9923 ( 415 ) 134 - 8900
112990bg4567 ( 803 ) 234 - 1456
070489qr3455 ( 415 ) 899 - 1426
$ awk '{printf substr($0,1,6)" ";printf substr($0,7,6)" ";\
print substr($0,13,length)}' fixed
031291 ax5633 ( 408 ) 987 -0124
021589 bg2435 ( 415 ) 866 - 1345
122490 de1237 ( 916 ) 933 - 1234
010187 ax3458 ( 408 ) 264 - 2546
092491 bd9923 ( 415 ) 134 - 8900
112990 bg4567 ( 803 ) 234 - 1456
070489 qr3455 ( 415 ) 899 - 1426
说明
第1个字段通过从整个记录中提取子串得到,子串从记录第一个字符开始、长度为6个字符。接下来,打印一个空格。第2个字段是通过在记录中提取从位置7开始、长度为6个字符的子串得到,后跟一个空格。最后一个字段则是通过在整个记录中提取从位置13开始、到由行的长度所确定的位置之间的子串获得(如果未指定参数,length函数返回当前行($0)的长度)。
空字段 如果用固定长度的字段来存储数据,就可能出现一些空字段。下面这个例子中,substr函数被用来保存字段,而不考虑它们是否包含数据。
范例
xxx xxx
xxx abc xxx
xxx a bbb
xxx xx
$ cat awkfix
# Preserving empty fields. Field width is fixed.
{
f [ 1 ] =substr ( $O , 1 , 3 )
f [ 2 ] =substr ( $O , 5 , 3 )
f [ 3 ] =substr ( $O , 9 , 3 )
line =sprintf ( "%-4s%-4s%-4s\n" ,f [ 1 ] ,f [ 2 ] ,f [ 3 ] )
print line
}
$ awk -f awkfix db
xxx xxx
xxx abc xxx
xxx a bbb
xxx xx
说明:
1. 打印文件db的内容。这个文件中有一些空字段。
2. 数组f的第1个元素被赋值为由位置1开始、长度为3的记录的子串。
3. 数组f的第2个元素被赋值为由位置5开始、长度为3的记录的子串。
4. 数组f的第3个元素被赋值为由位置9开始、长度为3的记录的子串。
5. 用sprintf函数设置好数组元素的格式,然后将它们赋值给用户自定义的变量line。
6. 打印line的值,可以看到结果中空字段依然被保留。
带$、逗号或其他字符的数字 下面这个例子中,价格字段中包含一个美元符号和逗号。脚本必须删掉这些字符,才能把价格加起来得出总的开销。可以通过gsub函数来完成这一任务。
范例
access tech:gp237221: 220:vax789: 20 / 20: 11 /01 / 90: $1 , 043.00
alisa systems:bp262292: 280:macintosh:new updates:06 / 30 / 91: $456.00
alisa systems:gp262345: 260:vax8700:alisa talk:02 /03 / 91: $1 , 598.50
apple computer:zx342567: 240:rnacs:e -mail:06 / 25190: $575.75
caci:gp262313: 280:sparc station:networkll.5:05 / 12 / 91: $1 , 250.75
datalogics:bp13.2455: 260:microvax2:pagestation maint:07 /01 / 90: $1 , 200.00
dec:zx354612: 220:microvax2:vms srns:07 / 20 / 90: $1 , 350.00
$ awk -F: '{gsub(/\$/,"");gsub(/,/,"");cost +=$7};\
END{print "The tota1 is $" cost}' vendor
$7474
说明:第一个gsub函数用空字符串对美元符号(\$)进行全局替换;第二个gsub函数则用空串替换全部逗号。然后,将用户自定义变量cost与每行的第7个字段相加,再把每次的结果赋回给cost,由此统计出总数。END块打印出字符串"The total is $",后面跟着cost的值。
参考资料:http://www.linuxawk.com/jiaocheng/325.html