Adiciona coluna a uma tabela

2

Eu tenho vários arquivos ASCII, com uma coluna de dados, da seguinte forma:

DATA
1564
1896
1238
1479
1562
1894
1489
....

Eu preciso implementar uma coluna contendo a data. Eu sei que cada conjunto de dados começa em 1900-01-01 (Ano-Mês-Dia). Portanto, gostaria de reformatar cada arquivo da seguinte forma:

DATE DATA
1900-01-01 1564
1900-01-02 1896
1900-01-03 1238
1900-01-04 1479
1900-01-05 1562
1900-01-06 1894
1900-01-07 1489
.....

Como posso fazer isso?

    
por steve 01.07.2016 / 12:52

2 respostas

6

Se você tiver acesso ao GNU date , você pode fazer:

$ ( date="1899-12-31"; printf 'DATE\tDATA\n';  
    tail -n+2 file | 
        while read line; do 
            date="$(date -d "$date + 1 day" +%F)" 
            printf '%s\t%s\n' "$date" "$line"
        done; ) > newfile

Explicação

  • date="1899-12-31" : defina a variável $date para a data de início menos um dia.
  • printf 'DATE\tDATA\n'; : imprime os cabeçalhos das colunas.
  • tail -n+2 file | : imprime tudo, exceto a primeira linha (o cabeçalho) do seu arquivo, e passa para o loop while .
  • while read line; do ... ; done : processa cada linha de entrada, salvando-a como $line .
  • date="$(date -d "$date + 1 day" +%F)" : adicione um dia ao valor de $date .
  • printf '%s\t%s\n' "$date" "$line" : imprime as variáveis $date e $line atuais.
  • ( ... ) > newfile : isso faz com que todo o comando seja executado em um subshell para que você possa capturar a saída do primeiro printf e o loop e redirecioná-lo para newfile .
por 01.07.2016 / 13:12
3
#!/bin/bash

printf "DATE\tDATA\n"

offset=0

sed -n '2,$p' |
while read data; do
        thedate=$( gdate -d "1900-01-01 + $offset days" +"%F" )
        printf "%s\t%s\n" "$thedate" "$data"
        (( ++offset ))
done

Este pequeno script é executado com

$ bash script.sh <data
DATE    DATA
1900-01-01  1564
1900-01-02  1896
1900-01-03  1238
1900-01-04  1479
1900-01-05  1562
1900-01-06  1894
1900-01-07  1489

Imprime o cabeçalho e pula a primeira linha de entrada do arquivo de entrada (contendo o cabeçalho " DATA ").

Ele calcula a data da linha atual como um deslocamento de 1900-01-01 usando o GNU date (que é chamado de gdate no meu sistema, se for chamado apenas de date no seu sistema, altere essa linha ).

Em seguida, ele exibe a data computada no formato correto junto com os dados lidos da entrada, em duas colunas delimitadas por tabulações.

    
por 01.07.2016 / 13:25