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

问题描述 投票:0回答:3

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

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

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

我已经尝试过这样的命令。 尾部 +2 文件名 |切-d"|" -f1 | awk '{ 打印长度}' |排序-r |优衣库

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

unix awk
3个回答
15
投票

这可以是执行此操作的通用方法,这样您就不必关心拥有的字段数量:将长度存储在数组中并不断检查它是否是最大值。最后,循环它们并打印结果。

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

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

0
投票

基于 fedorqui 的答案,这可以与 GNU Parallel 并行化:

# Find longest field
#
# usage:   awk -v col=3 -f my.csv
# returns: field-length data for column #3
#
# can be parallelized with GNU Parallel
#       parallel awk -v col={} -f my.csv ::: `seq 64`
# where 64 is the number of columns in the CSV file.

BEGIN {
    FPAT = "([^,]+)|(\"[^\"]+\")"
}

NR>1 {
    if (length($col) > max) {
        max = length($col)
        maxline = $col
    }
}

END {
    printf "col. = %-8d: max. len. = %-8d @ row = %-8s\n", col, max, maxline
}
© www.soinside.com 2019 - 2024. All rights reserved.