假设,我有一个这样的源文件。
ID|NAME|ADDRESS
1|ABC|PUNE
2|XYZA|MUMBAI
12|VB|NAGPUR
我想获取每列的最大长度(不包括标题名称)。 输出应该是这样的。 2|4|6
我已经尝试过这样的命令。 尾部 +2 文件名 |切-d"|" -f1 | awk '{ 打印长度}' |排序-r |优衣库
这适用于第一列。 awk 中是否有任何选项可以获取每列的最大长度?
这可以是执行此操作的通用方法,这样您就不必关心拥有的字段数量:将长度存储在数组中并不断检查它是否是最大值。最后,循环它们并打印结果。
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
这可能对你有用(但如果有很多字段,我会使用
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
基于 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
}