Question

Bonjour, je souhaite supprimer une ligne d’un fichier correspondant à un modèle particulier. le code que j'utilise est

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

Le code indique que le fichier comporte des lignes "!! " les champs séparés et 7 est un format de date aaaaammjjhhmmss. Le script supprime une ligne dont la date est inférieure à la date système. Mais ça ne marche pas. Quelqu'un peut-il me dire la raison?

Était-ce utile?

La solution

L'affectation awk (1) est-elle due mardi? Vraiment, awk ?? : -)

Ok, je ne savais pas exactement ce que vous recherchiez, alors j'ai fait des suppositions. Ce programme awk obtient l'heure actuelle de la journée puis supprime chaque ligne du fichier moins que cela. J'ai laissé une impression de débogage.

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

Autres conseils

appelez date en premier pour transmettre la date formatée en tant que paramètre:

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

Il vous faudra probablement exécuter la commande date - peut-être avec des backticks - pour obtenir la date dans stopDate. Si vous imprimez stopDate avec le code tel qu'il est écrit, il ne contiendra pas "date + ...", pas une chaîne de chiffres. C’est la cause première de votre problème.

Malheureusement ...

Je ne trouve aucune preuve de l'efficacité des backticks dans les versions d'awk (old awk, new awk, GNU awk). Donc, vous devez migrer le code vers Perl (Perl a été conçu à l’origine comme un 'awk-killer' - et inclut toujours a2p pour convertir les scripts awk en Perl), ou vous devez reconsidérer la la date est fixée.

Voir la réponse de @ DigitalRoss, la fonction strftime () de gawk vous fournit le formatage souhaité (cochez la case "info gawk" comme je l'ai fait).

Ceci corrigé, vous devriez supprimer les bonnes lignes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top