Удалить строку с узором

Привет, я хочу удалить строку из файла, которая соответствует определенному шаблону, код, который я использую,

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
      }

Код говорит, что в файле есть строки "!" разделены, а 7-е поле представляет собой дату в формате ггггммддччммсс. Скрипт удаляет строку, дата которой меньше системной даты. Но это не работает. Может ли кто-нибудь сказать мне причину?


person Vijay    schedule 15.09.2009    source источник
comment
Дубликат stackoverflow.com/questions/1422382/   -  person Dennis Williamson    schedule 15.09.2009


Ответы (3)


Задание awk(1) нужно выполнить во вторник? Правда, ок?? :-)

Хорошо, я не был уверен, что именно вы хотели, поэтому я сделал несколько предположений. Эта 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
$ 
person DigitalRoss    schedule 15.09.2009

сначала вызовите date, чтобы передать отформатированную дату в качестве параметра:

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

Вам, вероятно, потребуется запустить команду даты - возможно, с обратными кавычками - чтобы получить дату в stopDate. Если вы напечатаете stopDate с кодом, как написано, он будет содержать дату +..., а не строку цифр. Это основная причина вашей проблемы.

К сожалению...

Я не могу найти доказательств того, что обратные кавычки работают в любой версии awk (старый awk, новый awk, GNU awk). Таким образом, вам нужно либо перенести код на Perl (Perl изначально был разработан как «убийца awk» и по-прежнему включает a2p для преобразования awk-скриптов в Perl), либо вам нужно пересмотреть способ установки даты.

Увидев ответ @DigitalRoss, функция strftime() в gawk предоставляет вам нужное форматирование (отметьте «info gawk», как это сделал я).

С этим исправлением вы должны удалить правильные строки.

person Jonathan Leffler    schedule 15.09.2009