solaris awk problemas com data e instruções if

2

Eu tenho arquivos diários que chegam via FTP com datas incorretas na primeira coluna do arquivo. Eu descobri como deduzir um dia para obter a data correta e imprimi-lo em um novo arquivo. O principal problema é que meu script funciona em unix usando gnu, mas não em solaris.

dados contidos no arquivo:

End Date,Name,Amount
02/07/2014,data1, data2
02/02/2014,data1, data2
02/06/2014,data1, data2
02/06/2014,data1, data2
02/06/2014,data1, data2
02/10/2014,data1, data2
02/12/2014,data1, data2
02/20/2014,data1, data2
02/20/2014,data1, data2
02/21/2014,data1, data2
02/28/2014,data1, data2
03/03/2014,data1, data2

Script:

awk 'BEGIN{FS=OFS=","}
     NR==1 {print}
     NR>1 {
       ("date -d \""$1" -1 day\" +%m/%d/%Y")|getline newline
       $1=newline
       print
     }' wrongdates.csv > correctdates.csv

Eu consegui mover parte do script para nawk na caixa solaris, mas agora ele está reclamando que 'date -d' não é suportado e quando eu tento alterar isso, recebo 'date: bad conversion'.

Além disso, o texto acima não leva em consideração fins de semana ao alterar as datas com o arquivo, pois eu só me preocupo com dias úteis e estou tentando introduzir instruções if e else. conforme o abaixo

    nawk 'BEGIN{FS=OFS=","} NR==1 {print};NR>1 {if (date "$1" "+%u"==1) ("date -d \""$1" -1 day\" +%m/%d/%Y")| getline newline; $1=newline; {print}; else ("date \""$1" -3 day\" +%m/%d/%Y")| getline newline; $1=newline; print}' file20140228.csv > file2.csv

Parece que não estou chegando onde com a sintaxe de minhas declarações if e else e a última data em minha amostra 03/03/2014 deve ser convertida para 28/02/2014 e 28/02/2014 deve se tornar 02 / 27/2014.

    
por user61818 04.03.2014 / 13:04

1 resposta

3

date -d é específico do GNU. Aqui, você está executando um shell e um comando date por linha, isso é terrivelmente ineficiente. Faça tudo em perl :

perl -MPOSIX -pe 's{^(\d\d)/(\d\d)/(\d{4})}{
  $t = mktime(0, 12, 0, $2, $1 - 1, $3 - 1900);
  @t = localtime $t;
  $t -= 86400 * ($t[6] <= 1 ? $t[6] + 2 : 1);
  strftime("%m/%d/%Y", localtime $t)}e'

Ou com Time::Piece , se disponível:

perl -MTime::Piece -pe 's{^\d\d/\d\d/\d{4}}{
  $t = Time::Piece->strptime("$& 12", "%m/%d/%Y %H");
  $d = $t->day_of_week;
  $t -= 86400 * ($d <= 1 ? $d + 2 : 1);
  $t->strftime("%m/%d/%Y")}e'
    
por 04.03.2014 / 14:43