2014-07-09 33 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