Elimina una linea con un motivo
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?
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.