Pregunta

Hola, quiero eliminar una línea de un archivo que coincida con un patrón particular el código que estoy usando es

BEGIN {
       FS = "!";
       stopDate = "date +%Y%m%d%H%M%S";
       deletedLineCtr = 0;   #diagnostics counter, unused at this time
      }
      {
     if( $7 < stopDate )
          {
           deletedLineCtr++;
          }
      else
           print <*>
      }

El código dice que el archivo tiene líneas "! " separado y el séptimo campo es un formato de fecha aaaammddhhmmss. El script elimina una línea cuya fecha es menor que la fecha del sistema. Pero esto no funciona. ¿Alguien puede decirme la razón?

¿Fue útil?

Solución

¿La asignación de awk (1) vence el martes? ¿En serio, awk? :-)

Ok, no estaba seguro exactamente de lo que estabas buscando, así que hice algunas conjeturas. Este programa awk obtiene la hora actual del día y luego elimina cada línea en el archivo menos que eso. Dejé una impresión de depuración.

BEGIN {
  FS = "!"
  stopDate = strftime("%Y%m%d%H%M%S")
  print "now: ", stopDate
}
{ if ($7 >= stopDate) print 
$ cat t2.data
!!!!!!20080914233848
!!!!!!20090914233848
!!!!!!20100914233848
$ awk -f t2.awk < t2.data
now:  20090914234342
!!!!!!20100914233848
$ 
}

<*>

Otros consejos

llame a date primero para pasar la fecha formateada como parámetro:

awk -F'!' -v stopdate=$( date +%Y%m%d%H%M%S ) '
    $7 < stopdate { deletedLineCtr++; next }
    {print}
    END {do something with deletedLineCrt...}
'

Probablemente necesite ejecutar el comando de fecha, tal vez con comillas inversas, para poner la fecha en stopDate. Si imprimió stopDate con el código tal como está escrito, contendría '' fecha + ... '', no una cadena de dígitos. Esa es la raíz del problema.

Desafortunadamente ...

No puedo encontrar ninguna evidencia de que los backticks funcionen en ninguna versión de awk (antiguo awk, nuevo awk, GNU awk). Por lo tanto, debe migrar el código a Perl (Perl se diseñó originalmente como un 'awk-killer', y todavía incluye a2p para convertir scripts awk a Perl), o debe reconsiderar cómo la fecha está establecida.

Al ver la respuesta de @ DigitalRoss, la función strftime () en gawk le proporciona el formato que desea (marque 'info gawk' como lo hice yo).

Con eso solucionado, debería eliminar las líneas correctas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top