免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 20803 | 回复: 17
打印 上一主题 下一主题

请教在awk中printf里如何使用变量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-01-05 10:50 |只看该作者 |倒序浏览
如题,源文件为file.dat
$cat file.dat
8
5
99
485
547


awk '{printf("%08d",$1)}'  file.dat

这个8该如何用变量来表示呢,下面这个var使用就不行
awk '{var=8} {printf("%0vard",$0)}' file.dat

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-01-05 11:02 |只看该作者
/home/lee#var=9
/home/lee#seq 5|awk '{printf "%0'"$var"'d\n",$0}'

00000001
00000002
00000003
00000004
00000005

论坛徽章:
0
3 [报告]
发表于 2006-01-05 14:50 |只看该作者
呵呵,好久没来了,火哥还是那样热情啊
变量在外设置awk里使用试过,但就是在awk printf里不知道该如何用变量
比如想让例文件file.dat在右边不足3位就补足3,以零填充
$cat file.dat
8
5
99
485
547

想得到的就是
800
500
990
485
547


awk '{if(length($0)<3) {var=3-length($0) ; printf("%s%0vard",$0,0)
else print $0}' file.dat

这个printf 里的var该如何使用呢

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2006-01-05 15:14 |只看该作者
原帖由 styr 于 2006-1-5 14:50 发表
呵呵,好久没来了,火哥还是那样热情啊
变量在外设置awk里使用试过,但就是在awk printf里不知道该如何用变量
比如想让例文件file.dat在右边不足3位就补足3,以零填充
$cat file.dat
8
5
99
485
547
  ...

对awk不是很了解,用shell如何?
/home/lee#cat a
8
5
99
485
547

  1. /home/lee#cat f
  2. #!/bin/bash
  3. #略计算每行最大长度
  4. #dooo(){
  5. n=1
  6. while((n<=$1));do
  7.         echo -n 0
  8.         ((n++))
  9. done
  10. }
  11. while read i;do
  12. [[ ${#i} != 3 ]] && echo $i$(dooo $((3-${#i})))||echo $i
  13. done<a
复制代码
result
/home/lee#sh f
800
500
990
485
547

论坛徽章:
0
5 [报告]
发表于 2006-01-05 15:33 |只看该作者
用shell是可以,但是我的源文件可能有的近万条记录,如果用shell的函数可能效率太低了,我只能做了个awk的往右填充的函数,但感觉也不是那么直接。最好还是能用printf的变量就最好了

awk '{if (length($3)<1 sfz=right($3)
else sfz=$3}
{printf("%8d%s%-22s%4s%18s%s%-30s%s\n",$1,"|",$2,"|01|",sfz,"|000000000000|",$4,"|"}
function right(addright)
{
a=sprintf("%018s",addright)
match(a,/(0)+/)
b=substr(a,RESTART,RLENGTH)
c=substr(a,RLENGTH+1)
return sprintf("%s%s",c,b)
}' tmpfile >> open

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2006-01-05 15:38 |只看该作者
try:
/home/lee#cat a
8
5
99
485
547

  1. /home/lee#printf "%-3d\n" $(<a)|sed 's/ /0/g'
复制代码
800
500
990
485
547

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
7 [报告]
发表于 2006-01-05 15:43 |只看该作者
printf ("....%0" var "s....",...)

printf ("%0*s" ,var ,567)
都行
和C一样的

[ 本帖最后由 waker 于 2006-1-5 15:44 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-01-05 16:42 |只看该作者
学习,怎么我看这个有点累 C忘的差不多了

论坛徽章:
0
9 [报告]
发表于 2006-01-05 17:14 |只看该作者
原帖由 styr 于 2006-1-5 14:50 发表
呵呵,好久没来了,火哥还是那样热情啊
变量在外设置awk里使用试过,但就是在awk printf里不知道该如何用变量
比如想让例文件file.dat在右边不足3位就补足3,以零填充
$cat file.dat
8
5
99
485
547
  ...

请使用awk专用左对齐符号“-”
wayy2008 该用户已被删除
10 [报告]
发表于 2006-01-05 20:36 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP