Pergunta

Oi eu quero excluir uma linha de um arquivo que corresponde a determinado padrão o código que estou usando é

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
      }

O código diz que o arquivo tem linhas "!" separados e 7 de campo é um formato de data yyyymmddhhmmss. O script exclui uma linha cuja data é menor que a data do sistema. Mas isso não funciona. Qualquer um pode dizer-me o motivo?

Foi útil?

Solução

É o awk (1) atribuição devido terça? Realmente, awk ?? : -)

Ok, eu não tinha certeza exatamente o que você estava atrás, então eu fiz algumas suposições. Este programa awk obtém a hora atual do dia e, em seguida, remove todas as linhas no arquivo menos que isso. Deixei uma impressão de depuração no.

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
$ 

Outras dicas

chamada date primeiro a passar a data formatada como um parâmetro:

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

Você provavelmente precisará executar o comando data - talvez com acentos graves - para obter a data em stopDate. Se você imprimiu stopDate com o código como está escrito, que conteria "data + ...", não uma seqüência de dígitos. Que é a causa raiz de seu problema.

Infelizmente ...

Eu não consigo encontrar nenhuma evidência de que backticks trabalhar em qualquer versão do awk (awk velho, novo awk, GNU awk). Então, você quer necessidade de migrar o código para Perl (Perl foi originalmente concebido como um 'awk-killer' - e ainda inclui a2p a scripts convertido awk para Perl)., Ou você precisa de reconsiderar a forma como a data é definida

Vendo @ resposta de DigitalRoss, a função strftime() em gawk fornece-lhe com a formatação desejada (cheque 'info gawk' como eu fiz).

Com que fixa, você deve estar recebendo as linhas direitas excluída.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top