es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

bash convertir filas en columnas en formato de tabla

Estoy tratando de convertir filas en columnas en formato de tabla.

Nombre del servidor         : dev1-151vd
  Estado                     : CONCLUIDO
  Hora de inicio             : 2021-12-20 04:30:05.458719-05:00
  Hora de finalización       : 2021-12-20 04:33:15.549731-05:00

  Nombre del servidor         : dev2-152vd
  Estado                     : CONCLUIDO
  Hora de inicio             : 2021-12-20 04:30:05.405746-05:00
  Hora de finalización       : 2021-12-20 04:30:45.212935-05:00

Utilicé el script awk siguiente para transponer filas en columnas

awk -F":" -v n=4 \
  'BEGIN { x=1; c=0;} 
  ++c <= n && x == 1 {print $1; buf = buf $2 "\n";
       if(c == n) {x = 2; printf buf} next;}
   !/./{c=0;next}
    c <=n {printf "%4s\n", $2}' temp1.txt | \
   paste - - - - | \
   column -t -s "$(printf "\t")"




Nombre del servidor        Estado         Hora de inicio       Hora de finalización
 dev1-151vd                 CONCLUIDO      2021-12-20 04     2021-12-20 04
 dev2-152vd                 CONCLUIDO      2021-12-20 04     2021-12-20 04

El resultado anterior no tiene la hora de inicio y la hora de finalización adecuadas. Por favor, avíseme cómo obtener el formato correcto para que se imprima la hora correctamente.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para formatear correctamente las columnas de hora de inicio y hora de finalización en la salida, debemos modificar el script awk para dividir el valor de tiempo utilizando el delimitador de espacio y luego concatenar los valores de fecha y tiempo en el formato deseado.

    Aquí está el script awk actualizado:

    awk -F":" -v n=4 '
        BEGIN { x=1; c=0;}
        ++c <= n && x == 1 {
            if ($1 == "Begin time" || $1 == "End time") {
                split($2, dt, " ");
                gsub(/-|:/, " ", dt[1]);
                hms = sprintf("%02d %02d %02d", substr(dt[2], 1, 2), substr(dt[2], 4, 2), substr(dt[2], 7, 2));
                buf = buf dt[1] " " hms "\n";
            } else {
                print $1;
                buf = buf $2 "\n";
            }
            if (c == n) {
                x=2;
                printf buf
            }
            next;
        }
        !/./ { c=0; next }
        c <= n { printf "%-25s", $2 }
    ' temp1.txt | paste - - - - | column -t -s "$(printf "\t")"
    

    Los cambios incluyen:

    • Agregar una condición if para verificar si el campo actual es Begin time o End time. Si es así, dividir el valor de tiempo utilizando el delimitador de espacio y formatear la salida como se desee.
    • Usar sprintf para formatear el valor de tiempo en el formato HH MM SS.
    • Usar printf para alinear a la izquierda los valores en la salida.
    • Reemplazar %4s con %-25s para ajustar el ancho de la columna.

    Con estos cambios, la salida debería estar formateada correctamente:

    Server Name            Status  Begin time             End time               
    dev1-151vd             DONE    2021-12-20 04 30 05    2021-12-20 04 33 15    
    dev2-152vd             DONE    2021-12-20 04 30 05    2021-12-20 04 30 45    
    

Comments are closed.