Supongamos, tengo un archivo de código fuente como esta.

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

Quiero obtener la longitud máxima de cada columna (excluyendo los nombres de encabezado).
La salida debe ser como este.
Un 2/4/6

He probado el comando como este.
cola +2 nombre de archivo | cut-d»|» -f1 | awk ‘{ print longitud }’ | sort -r | uniq

Esto funciona para la 1ª columna. ¿Hay alguna opción disponible en awk para obtener la longitud máxima de cada columna?

InformationsquelleAutor Vicky | 2014-07-09

2 Comentarios

  1. 11

    Esto puede ser una manera general para hacerlo, así que usted no tiene que preocuparse del número de campos que tiene: la tienda de las longitudes en una matriz y mantener el control de si es el máximo o no. Finalmente, el bucle a través de ellos y de impresión de los resultados.

    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

    Ver la salida:

    $ 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

    Para la variable número de columnas, podemos almacenar la máxima cantidad de columnas por ejemplo 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
    • Gracias fedorqui. a mí me funciona.
    • Que puede imprimir la salida correcta si cada línea tiene el mismo número de campos, lo que si la última línea falta uno?
    • si es así, podemos almacenar el máximo de NF y bucle basado en eso. Ver la actualización.
  2. 3

    Esto podría funcionar para usted (pero si hay muchos campos que haría uso de for ciclo y una matriz para almacenar la longitud de los campos…):

    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

Dejar respuesta

Please enter your comment!
Please enter your name here