2014-07-09 27 views
0

假设,我有一个这样的源文件。如何获得unix中每列的最大长度?

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

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

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

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

提前感谢您的时间。

回答

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

由于fedorqui。 它适合我。 – Vicky

+0

@fedorqui如果每行有相同数量的字段,那么可能会输出正确的输出,如果最后一行没有输出,该怎么办? –

+2

@ZsoltBotykai如果是这样,我们可以存储最大NF和循环的基础上。查看更新。 – fedorqui

2

这可能会为你工作(但如果有很多领域我会用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 
相关问题