awk固定字段

下面这个例子中,字段都是固定宽度的,但没有使用字段分隔符substr函数可以用来创建字段。
范例

cat fixed
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函数被用来保存字段,而不考虑它们是否包含数据。
范例

cat db
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函数来完成这一任务。
范例

cat vendor
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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值