Вопрос

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

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

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

Это было полезно?

Решение

Должно ли быть назначено назначение awk (1) во вторник? Действительно, awk ?? : -)

Ладно, я не был точно уверен, за кем вы были, поэтому я догадался Эта awk-программа получает текущее время дня, а затем удаляет каждую строку в файле меньше этого. Я оставил одну отладочную печать в.

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

Другие советы

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

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

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

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

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

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

После исправления вы должны удалить нужные строки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top