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
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 RT
captura el separador de registro para cada registro, y se almacena en la variable oRT
y se imprime en el siguiente registro siempre que haya algunos elementos para imprimir (que se captura conNF
).
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.
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
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 -.
RT
es 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".