Tengo un archivo con columnas de longitud dinámica (cuatro) separadas con tabulaciones (una columna puede tener espacios)
COL1 COL2 COL2 COL2 COL3 COL3 COL4
COL1 COL2 COL2 COL3 COL4 COL4
COL1 COL1 COL2 COL2 COL3 COL4 COL4 COL4
¿Me gustaría formatearlo dinámicamente con printf en awk? Puedo formatearlo con ajustes fijos:
$ awk 'BEGIN {FS="t"}; {printf "%-10s %-10s %-15s %-15sn", $1,$3,$4,$2}' test
COL1 COL3 COL3 COL4 COL2 COL2 COL2
COL1 COL3 COL4 COL4 COL2 COL2
COL1 COL1 COL3 COL4 COL4 COL4 COL2 COL2
Respuesta aceptada:
en bash, usando column
$ column -s $'t' -t file.tsv
col1 col2 col2 col2 col3 col3 col4
col1 col2 col2 col3 col4 col4
col1 col1 col2 col2 col3 col4 col4 col4
column -t
usa 2 espacios para separar las columnas
Con awk, escribiría
awk -F 't' -v cols=4 '
NR == FNR {
for (i=1; i<=cols; i++)
if (NR == 1 || length($i) > w[i])
w[i] = length($i)
next
}
{
for (i=1; i<=cols; i++)
printf "%-*s%s", w[i], $i, (i == cols ? ORS : FS)
}
' file.tsv file.tsv
Donde estoy procesando el archivo dos veces:primero para encontrar el ancho máximo para cada columna, luego nuevamente para reformatear el archivo. Uso una pestaña para separar las columnas en la salida.
col1 col2 col2 col2 col3 col3 col4
col1 col2 col2 col3 col4 col4
col1 col1 col2 col2 col3 col4 col4 col4