如何获得unix中每列的最大长度?

时间:2014-07-09 12:31:18

标签: unix awk

假设我有这样的源文件。

ID|NAME|ADDRESS
1|ABC|PUNE
2|XYZA|MUMBAI
12|VB|NAGPUR

我想获得每列的最大长度(不包括标题名称)。 输出应该是这样的。     2 | 4 | 6

我试过这样的命令。      tail +2 filename | cut -d" |" -f1 | awk' {print length}' | sort -r | uniq的

这适用于第1列。在awk中是否有任何选项可以获得每列的最大长度?

2 个答案:

答案 0 :(得分:11)

这可以是一般的方法,因此您不必关心您拥有的字段数量:将长度存储在数组中并继续检查它是否是最大值。最后,循环遍历它们并打印结果。

awk -F'|' 'NR>1{for (i=1; i<=NF; i++) max[i]=(length($i)>max[i]?length($i):max[i])}
           END {for (i=1; i<=NF; i++) printf "%d%s", max[i], (i==NF?RS:FS)}' file

见输出:

$ awk -F'|' 'NR>1{for (i=1; i<=NF; i++) max[i]=(length($i)>max[i]?length($i):max[i])} END {for (i=1; i<=NF; i++) printf "%d%s", max[i], (i==NF?RS:FS)}' a
2|4|6

对于可变数量的列,我们可以存储最大列数,例如cols

$ awk -F'|' 'NR>1{cols=(cols<=NF?NF:cols); for (i=1; i<=NF; i++) max[i]=(length($i)>max[i]?length($i):max[i])} END {for (i=1; i<=cols; i++) printf "%d%s", max[i], (i==cols?RS:FS)}' a
2|4|6

答案 1 :(得分:3)

这可能适合你(但是如果有很多字段我会使用for循环和一个数组来存储字段的长度......):

awk -F '|' 'NR>1 {if ( length($1) > l1 ) { l1=length($1) }
                  if ( length($2) > l2 ) { l2=length($2) }
                  if ( length($3) > l2 ) { l3=length($3) }
                 }
             END { print l1 "|" l2 "|" l3 }' INPUTFILE