Если еще, Awk NR: Как удалить заголовок раздела таблицы, где нет записей

if awk --version 2>&1 | grep -q "GNU Awk"
then
    awk 'BEGIN {print "I am GNU Awk"}'

elif awk -Wv 2>&1 | grep -q "mawk"
then
    awk 'BEGIN {print "I am mawk"}'

else
    awk 'BEGIN {print "I might be nawk, might not be"}'
fi

В качестве альтернативы test is awk представляет собой символическую ссылку:

awk=$( command -v awk )
[[ -L $awk ]] && readlink $awk # make some decision about the result of that
4
05.06.2018, 12:45
4 ответа

Siempre que tenga GNU awk, podría usar este script:

awk -v RS='={105}[^=]*={105}' 'NF{print oRT,$0} {oRT=RT}' file

El encabezado de la tabla se establece como un separador de registros de varias líneas RS. Se compone del doble de 105 =caracteres con algo intermedio.

La variable RTcaptura el separador de registro para cada registro, y se almacena en la variable oRTy se imprime en el siguiente registro siempre que haya algunos elementos para imprimir (que se captura conNF).

1
27.01.2020, 20:54

Cree un script ejecutable test.awk, que contenga

awk '
  # { print "read " $0 }
  /^SYS/ {
    if (H) {
      if (F) {print F} else { F="\r\n\r\n"}
      print H; H=""}
    print
    next
  }
  /^./ {
    H=$0
    for (i=1; i<5; i++) {
      getline
      H = H "\r\n" $0
    }
    next
  }
' $@

y ejecutar

test.awk original_output.txt

"/^SYS/ {" se puede reemplazar por cualquier cosa que reconozca una línea de datos.

1
27.01.2020, 20:54

Este problema se puede abordar con Perl de esta manera.

Código

perl -F'/^=+$/m' -lan -0777e '
   my($dashes) = /^(=+)$/m;
   shift @F; pop @F;
   while ( @F > 1 ) {
      my($h, $s) = splice @F, 0, 2;
      next if $s =~ /^(?:\h*\n)+$/;
      print join $dashes, q(), $h, $s, !@F ? q() : ();
   }
' input.txt

Salida

=========================================================================================================
Month: Jun

Counter Name                                06/04 18:00     06/04 17:00     06/04 16:00     06/04 15:00
=========================================================================================================
SYS.SYS.SYS.SYS.SYS.SYS.                  : 45              45              45              45
SYS.SYS.SYS.SYS.SYS.SYS.                  : 45              45              45              45



=========================================================================================================
Month: Jun

Counter Name                                06/05 14:00     06/05 13:00     06/05 12:00     06/05 11:00
=========================================================================================================
SYS.SYS.SYS.SYS.SYS.SYS.                  : 45              45              45              45
SYS.SYS.SYS.SYS.SYS.SYS.                  : 45              45              45              45



=========================================================================================================
Month: Jun

Counter Name                                06/05 06:00     06/05 05:00     06/05 04:00     06/05 03:00
=========================================================================================================
SYS.SYS.SYS.SYS.SYS.SYS.                  : 45              45              45              45
SYS.SYS.SYS.SYS.SYS.SYS.                  : 45              45              45              45



=========================================================================================================
Month: Jun

Counter Name                                06/04 18:00     06/04 17:00     06/04 16:00     06/04 15:00
=========================================================================================================
SYS.SYS.SYS.SYS.SYS.SYS.                  : 45              45              45              45
SYS.SYS.SYS.SYS.SYS.SYS.                  : 45              45              45              45


=========================================================================================================

Explicación

  • Sorber la entrada de una sola vez:-0777 opción aPerlhabilita eso.
  • Dividir todo este archivo (ahora se trata como una cadena larga )a lo largo de los guiones:/^=+$/m significa que siempre que una línea dada no contenga nada más que iguales repetidos es donde dividiremos el archivo en.
  • -una opción hará que perl rellene las partes divididas en la matriz @F .
  • La opción
  • -n de Perl deshabilitará la impresión automática justo antes de leer el siguiente registro Y también haceawk-como un bucle en los registros leídos desde la entrada.
  • En primer lugar, almacenamos la línea de guiones de la entrada.
  • Tenga en cuenta que la operación de división hará que el primer y el último elemento estén vacíos, por lo tanto, los eliminamos de la matriz @F antes de emprender la tarea principal.
  • Configuramos un bucle while que consume 2 elementos(empalme)a la vez de la matriz @F . Primero está el encabezado y segundo la sección. El bucle continúa mientras haya al menos 2 elementos en la matriz.
  • El punto clave está en tomar la decisión de omitir o no el procesamiento del dúo encabezado/sección. Y eso se decide cuando la sección comprende solo líneas vacías o líneas que comprenden solo espacios en blanco horizontales(\h). La expresión regular para eso es /^ (? :\h *\n )+$/
  • Ahora, si la sección no está vacía, queda la tarea de unir el dúo encabezado/sección con los guiones. Tenemos en cuenta que en el último encabezado/sección que se une, debemos agregar los guiones para redondear.
1
27.01.2020, 20:54

Similar a la respuesta de oliv, quizás un poco más simple:

gawk -v RS='=+\n' '
    NR % 2 == 0 {header = $0; next}
    /[^[:space:]]/ {printf "%s", RT header RT $0}
    END {print RT}
' output.txt 

Usando una línea de =s como separador de registro. El encabezado es entonces cada registro con número par. Y el "contenido" no está vacío si contiene un carácter de espacio en blanco que no sea -.

RTes una variable específica de GNU awk que contiene "El texto de entrada que coincidió con el texto indicado por RS, el separador de registros. Se establece cada vez que se lee un registro".

1
27.01.2020, 20:54

Теги

Похожие вопросы