【问题标题】:How to get max length of each column in unix?如何获取unix中每列的最大长度?
【发布时间】:2014-08-30 11:38:31
【问题描述】:

假设,我有一个这样的源文件。

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

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

我试过这样的命令。 tail +2 文件名 |剪切-d"|" -f1 | awk '{ 打印长度 }' |排序-r |独特的

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

【问题讨论】:

    标签: unix awk


    【解决方案1】:

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

    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
    

    【讨论】:

    • @fedorqui 如果每一行都有相同数量的字段,那可能会打印正确的输出,如果最后一行缺少一个怎么办?
    • @ZsoltBotykai 如果是这样,我们可以存储最大 NF 并在此基础上循环。查看更新。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 2010-11-06
      • 2021-06-18
      • 2012-10-15
      • 2017-10-26
      • 1970-01-01
      相关资源
      最近更新 更多