identificação de data awk do arquivo de entrada

1

Atualmente 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. No entanto, como os arquivos são exibidos todos os dias, o nome do arquivo será alterado e eu quero cron o script.

Minha pergunta é como faço para que meu script identifique a data anexada no final do arquivo no arquivo e acrescente ao arquivo de saída?

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

Script:

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

O formato 'Data1' geralmente é 20140228 ou %Y%m%d

* * além do acima eu descobri que isso só funciona em minha caixa unix e não em solaris.

Eu consegui movê-lo para nawk na caixa solaris, mas agora ele está reclamando que 'date -d' não é suportado e quando eu tento mudar 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}' StateStreetPositions20140228.csv

Parece que não recebo nenhuma palavra com a sintaxe das minhas declarações if e else.

    
por user61818 03.03.2014 / 13:07

1 resposta

2

Se eu entendi corretamente, você tem um arquivo chamado wrongdatefile20140228.csv e precisa criar um novo arquivo chamado correct_date20140228.csv ? Assumindo bash shell:

$ ls *.csv
wrongdatefile20140228.csv

Atribua um nome de arquivo à variável $fn e use Expansão de parâmetro

$ fn=wrongdatefile20140228.csv
$ awk '...' "$fn" > "${fn/#wrongdatefile/correct_date}"

Resultado:

$ ls *.csv
correct_date20140228.csv    wrongdatefile20140228.csv

Para automatizar isso para todos os arquivos wrongdatefile*.csv no diretório atual, ignorando arquivos previamente processados:

for fn in wrongdatefile*.csv; do 
    newfn="${fn/#wrongdatefile/correct_date}"
    [ -e "$newfn" ] || awk '...' "$fn" > "$newfn"
done
    
por 03.03.2014 / 14:28