2016-03-30 14 views
1

Ich möchte von dem Benutzer zwei Daten als Argument nehmen() mitTERMINE mit awk in UNIX

$./tool.sh --born-since <dateA> --born-until <dateB> 

und aus einer Datei die Zeilen drucken, die zwischen diesen beiden dates.For Beispiel sind:

933|Mahinda|Perera|male|1989-12-03|2010-03-17T13:32:10.447+0000|192.248.2.123|Firefox 
1129|Carmen|Lepland|female|1984-02-18|2010-02-28T04:39:58.781+0000|81.25.252.111|Internet Explorer 
4194|Hồ Chí|Do|male|1988-10-14|2010-03-17T22:46:17.657+0000|103.10.89.118|Internet Explorer 

Also, ich benutze awk Befehl wie folgt aus:

awk -F'|' '{print $4} [ file ... ] 

die Daten zu nehmen .. wie ich awk können die Daten aus dem t machen xt zu Sekunden Form?

Antwort

2

Wenn die Datumsvariablen dasselbe Format haben, können Sie alles in Zahlen umwandeln und Vergleiche verwenden.

awk -F'|' -v from=$dateA -v to=$dateB '{gsub("-","",$5); 
      gsub("-","",from); gsub("-","",to)} 
      from <= $5 && $5 <= to' file 

Hinweis, es ist das fünfte Feld in Ihrer Datei.

+0

ok ich verstehe Ihren Punkt, aber wie werde ich die ganze Zeile nach dem Vergleich drucken? – user3217800

+0

das ist es. Es wird standardmäßig die Zeile gedruckt, die die Bedingung erfüllt. Die Namen der Datumsvariablen wurden korrigiert. – karakfa

+0

Ich habe diesen Code: 'dateA = Datum -d" $ 2 "+% Y% m% d DatumB = Datum -d" $ 4 "+% Y% m% d awk -F '|' -v von = $ dateA -v bis = $ dateB '{gsub ("-", "", $ 5); gsub ("-", "", dateA); gsub ("-", "", dateB)} von <= $ 5 && $ 5 <= zu 'persons.dat.txt' aber wenn ich das Skript ausführen, druckt es nur das DatumA und dateB – user3217800

1

Sie können entweder die /bin/date +"%s" --date="DATESTRING" über system() anrufen, wenn die DATESTRING ein Format "/ bin/date" entspricht, oder Sie verwenden die interne mktime() -Funktion. Aber dann müssen Sie Ihr Datum aufzuspalten awk nach (1):

mktime(datespec) 
      Turn datespec into a time stamp of the same form as returned by systime(), and return the result. The datespec is a string of 
      the form YYYY MM DD HH MM SS[ DST]. The contents of the string are six or seven numbers representing respectively the full year 
      including century, the month from 1 to 12, the day of the month from 1 to 31, the hour of the day from 0 to 23, the minute from 0 
      to 59, the second from 0 to 60, and an optional daylight saving flag. The values of these numbers need not be within the ranges 
      specified; for example, an hour of -1 means 1 hour before midnight. The origin-zero Gregorian calendar is assumed, with year 0 
      preceding year 1 and year -1 preceding year 0. The time is assumed to be in the local timezone. If the daylight saving flag is 
      positive, the time is assumed to be daylight saving time; if zero, the time is assumed to be standard time; and if negative (the 
      default), mktime() attempts to determine whether daylight saving time is in effect for the specified time. If datespec does not 
      contain enough elements or if the resulting time is out of range, mktime() returns -1. 

So müssen Sie Ihre Datumsfelder vorzubereiten, um die Form der zugehörigen Dokumentation zu verwenden.

split($5, D, "-"); 
DS = sprintf("%4d %2d %2d 00 00 00", D[1], D[2], D[3]); 
T = mktime(DS); 

sollte die Aufgabe erledigen.