Frage

Hallo Ich möchte eine Zeile aus einer Datei löschen, die bestimmten Muster entspricht der Code Ich verwende ist

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

Der Code besagt, dass die Datei hat Linien „!“ getrennt und 7. Feld ist ein Datum yyyymmddhhmmss Format. Das Skript löscht eine Zeile, deren Datum kleiner als das Systemdatum. Aber das funktioniert nicht. Kann jemand mir sagen, der Grund?

War es hilfreich?

Lösung

Ist die awk (1) Zuordnung aufgrund Dienstag? Wirklich, awk ?? : -)

Ok, ich war nicht sicher, was genau Sie waren nach so habe ich einige Vermutungen. Das awk-Programm wird die aktuelle Tageszeit und entfernt dann jede Zeile in der Datei weniger als das. Ich verließ ein Debug-Druck in.

BEGIN {
  FS = "!"
  stopDate = strftime("%Y%m%d%H%M%S")
  print "now: ", stopDate
}
{ if ($7 >= stopDate) print $0 }

$ cat t2.data
!!!!!!20080914233848
!!!!!!20090914233848
!!!!!!20100914233848
$ awk -f t2.awk < t2.data
now:  20090914234342
!!!!!!20100914233848
$ 

Andere Tipps

Aufruf date zuerst das formatierte Datum als Parameter zu übergeben:

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

Sie müßten wahrscheinlich das Datum Befehl ausgeführt werden sollen - vielleicht mit Backticks - das Datum in stopDate zu bekommen. Wenn Sie stopDate mit dem Code gedruckt wie geschrieben, wäre es enthalten „Datum + ...“, nicht eine Folge von Ziffern. Das ist die eigentliche Ursache des Problems.

Leider ...

Ich kann keine Beweise dafür finden, dass in Backticks einer beliebigen Version von awk arbeiten (alte awk, neue awk, GNU awk). Also, müssen Sie entweder den Code Perl migrieren (Perl wurde ursprünglich als ‚awk-Killer‘ - und nach wie vor enthalten a2p zu awk-Skripte Perl zu konvertieren), oder Sie müssen überdenken, wie das Datum festgelegt ist

Sehen @ DigitalRoss Antwort, die strftime() Funktion in gawk bietet Ihnen die Formatierung, die Sie wollen (Check 'info gaffen' wie ich).

Mit diesem festen, sollten Sie die richtigen Zeilen gelöscht zu werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top