Chinaunix
标题:
用awk怎样求出某一列的最大列宽
[打印本页]
作者:
daming31
时间:
2009-09-10 08:42
标题:
用awk怎样求出某一列的最大列宽
# cat file
aaa123
bbb1234
ccc1234567
如何能用awk求出这一列的最大宽度是10个字符?
其实这个问题是由另一个问题引出来的,
2009-08-09, Sun 00:01:02 0735huyh ip:134.165.11.2
2009-08-09, Sun 00:01:51 0746jqls ip:134.172.68.253
2009-08-09, Sun 00:05:15 0730tx ip:134.170.77.177
2009-08-09, Sun 00:09:38 0735huyh ip:134.165.11.2
2009-08-09, Sun 00:12:54 0735xujy ip:134.165.176.106
2009-08-09, Sun 00:13:04 0736yangj2 ip:134.166.169.79
2009-08-09, Sun 00:16:48 0746nyayy ip:134.172.68.246
2009-08-09, Sun 00:18:27 why ip:134.160.98.6
上面这段记录每个域是由/t即tab键分开的,但因为第四个域长短不一,所以导到第五个域显示不是很齐。
当然我用awk中的printf指定一下那几个域外的列宽,这个问题就貌似解决了,
# awk '{printf("%s\t%s\t%s\t%-25s%-25s\n",$1,$2,$3,$4,$5)}' file
2009-08-09, Sun 00:01:02 0735huyh ip:134.165.11.2
2009-08-09, Sun 00:01:51 0746jqls ip:134.172.68.253
2009-08-09, Sun 00:05:15 0730tx ip:134.170.77.177
2009-08-09, Sun 00:09:38 0735huyh ip:134.165.11.2
2009-08-09, Sun 00:12:54 0735xujy ip:134.165.176.106
2009-08-09, Sun 00:13:04 0736yangj2 ip:134.166.169.79
2009-08-09, Sun 00:16:48 0746nyayy ip:134.172.68.246
2009-08-09, Sun 00:18:27 why ip:134.160.98.6
但因为我不能确定第四个域中的最长的那条记录是多少个符,所以就不得不在printf时指定一个比较长的字符宽度。但这样还是不确定,即万一实际上最长的那个记录的字符宽度比我指定的还长,那显示就会在某一行又不对齐了。
不知道兄弟们在处理这种情况时有什么好方法吗?向大家请教了。
作者:
Minsic
时间:
2009-09-10 09:15
看着看着就被绕晕了
如果是只是某列的最大列宽的话可以这么做:
awk '{if(length($1)>s){s=length($1);l=NR}}END{print "line: "l",length: "s}' file
复制代码
作者:
Minsic
时间:
2009-09-10 09:17
想了想,是不是楼主想要的只是column -t file这样的显示效果?
作者:
daming31
时间:
2009-09-10 09:36
标题:
回复 #3 Minsic 的帖子
3Q Minsic
awk的这个length函数是要好好用一下的,用来求某一列数据的最大列宽还是很多的。
作者:
daming31
时间:
2009-09-11 10:07
标题:
回复 #3 Minsic 的帖子
原来用column -t file来格式化输入更方便。
太酷了
超级3Q Minsic
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2