Domanda

Ciao, voglio eliminare una riga da un file che corrisponde a un modello particolare il codice che sto usando è

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

Il codice dice che il file ha linee "! " separato e 7 ° campo è un formato data yyyymmddhhmmss. Lo script elimina una riga la cui data è inferiore alla data di sistema. Ma questo non funziona. Qualcuno può dirmi il motivo?

È stato utile?

Soluzione

L'assegnazione awk (1) è prevista martedì? Davvero, awk ?? : -)

Ok, non ero sicuro di cosa stavi cercando, quindi ho fatto alcune ipotesi. Questo programma awk ottiene l'ora del giorno corrente e quindi rimuove ogni riga del file in meno. Ho lasciato una stampa di debug.

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
$ 
}

<*>

Altri suggerimenti

chiama date per passare prima la data formattata come parametro:

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

Probabilmente avresti bisogno di eseguire il comando date - magari con backtick - per mettere la data in stopDate. Se hai stampato stopDate con il codice come scritto, conterrebbe " data + ... " ;, non una stringa di cifre. Questa è la causa principale del tuo problema.

Purtroppo ...

Non riesco a trovare alcuna prova del funzionamento dei backtick in nessuna versione di awk (vecchio awk, nuovo awk, GNU awk). Quindi, o devi migrare il codice in Perl (Perl era originariamente progettato come un 'awk-killer' - e include ancora a2p per convertire gli script awk in Perl), oppure devi riconsiderare come la data è impostata.

Vedendo la risposta di @ DigitalRoss, la funzione strftime () in gawk ti fornisce la formattazione che desideri (controlla 'info gawk' come ho fatto io).

Con quello riparato, dovresti eliminare le righe giuste.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top