假设,我有一个这样的源文件。
ID|NAME|ADDRESS 1|ABC|PUNE 2|XYZA|MUMBAI 12|VB|NAGPUR
我想获得每列的最大长度(不包括标题名称)。 输出应该是这样的。 2 | 4 | 6
我已经尝试过这样的命令。 尾+2文件名| 切-d“|” -f1 | awk'{print length}'| sort -r | uniq的
这适用于第一列。 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
这可能适用于你(但是如果有很多字段我会用循环和一个数组来存储字段的长度…):
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