comando de impresión awk con condición de NR> var

comando de impresión awk con condición de NR> var

Estoy intentando awkmodificar algunos archivos de texto usando este código.

awk -F":" '/^title/ { o=FNR+2 } ;FNR>o { print sprintf("%-10s %-10d %-10s",FILENAME,o,$0) }' r.txt

pero no funcionó hasta que reemplacé la condición como esta FNR>5.

Intenté mucho aquí pero no encontré la solución. puse "FNR>o"& FNR>$opero nada.

¡Chicos, alguien puede ayudarme aquí! aporte :

date: 22.01.2020
name : xrgsm02
title : RCV20
----------------
----------------
15   20
30   40
50   12
55   77

producción

r.txt   5  15   20
r.txt   5  30   40
r.txt   5  50   12
r.txt   5  55   77

Respuesta1

El problema:

FNR>o
  • Usar el >operador con un valor no inicializado
    • Si bien ono está inicializado, tiene un valor numérico de 0y un valor de cadena de la cadena vacía
    • En su secuencia de comandos, oestá configurado con /^title/ { o=FNR+2 }, pero /^title/no aparece hasta el tercer registro. Entonces, los dos primeros registros ono están inicializados y FNR>ose evalúan como true(porque FNR==1& FNR==2son greater than zero)

Solución posible:

o && FNR>o
  • Especifique que odebe ser distinto de cero, además deFNR>o

Además, oes algo confuso como nombre de variable de una sola letra; considere usar una letra como no una palabra más descriptiva como outputen su lugar.


print sprintf("%-10s %-10d %-10s",FILENAME,o,$0)

podría simplificarse a:

printf("%-10s %-10d %-10s\n",FILENAME,o,$0)

o incluso:

printf "%-10s %-10d %-10s\n",FILENAME,o,$0

información relacionada