سؤال

ومرحبا أريد حذف خط من ملف الذي يطابق نمط معين رمز أستخدمه هو

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
      }

والرمز يقول ان الملف يحتوي على خطوط "!" فصل والميدان 7TH هو تنسيق التاريخ yyyymmddhhmmss. السيناريو حذف خط له تاريخ أقل من تاريخ النظام. ولكن هذا لا يعمل. يمكن لأي أحد أن يقول لي السبب؟

هل كانت مفيدة؟

المحلول

هل AWK (1) مهمة المقرر الثلاثاء؟ حقا، AWK ؟؟ : -)

حسنا، لم أكن متأكدا بالضبط ما كنت بعد ذلك جعل بعض التخمينات. يحصل هذا البرنامج AWK الوقت الحالي ليوم واحد ثم يزيل كل سطر في الملف أقل من ذلك. تركت واحد طباعة التصحيح في.

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
$ 

نصائح أخرى

ودعوة date أولا لتمرير التاريخ تنسيق كمعلمة:

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

وأنت من المحتمل أن تحتاج إلى تشغيل الأمر الآن - ربما مع backticks - للحصول على موعد في stopDate. إذا كنت تطبع stopDate مع رمز كما هو مكتوب، فإنه يحتوي على "تاريخ + ..."، وليس سلسلة من الأرقام. وهذا هو السبب الجذري لمشكلتك.

للأسف ...

وأنا لا يمكن العثور على أي دليل على أن backticks يعمل في أي إصدار من AWK (AWK القديم، AWK الجديد، GNU AWK). لذلك، تحتاج إما إلى الهجرة رمز لبيرل (صمم بيرل أصلا ك "AWK قاتل" - ولا يزال يتضمن a2p لتحويل النصوص AWK إلى بيرل)، أو تحتاج إلى إعادة النظر في كيفية تحديد موعد

ورؤية @ الجواب DigitalRoss، فإن وظيفة strftime() في gawk يوفر لك التنسيق الذي تريد (راجع 'معلومات البله' كما فعلت).

مع ذلك ثابت، يجب أن يحصل في الاتجاه الصحيح حذفها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top