Adicionando linha à tabela

2

Eu tenho várias tabelas de texto simples ( table.txt ), com séries temporais indo de 2005 até 2099 . Infelizmente, alguns deles estão perdendo o último dia da série temporal 31.12.2099 , conforme segue:

YEAR MONTH DAY RES
2005 1     1   1000
2005 1     2   1001
[...]
2099 12    29  1002
2099 12    30  1003

Como posso adicionar o dia em falta da série temporal ( 31.12.2099 ) colando o valor ( RES ) do dia anterior? Considerando o exemplo mínimo fornecido, a saída deve ser assim:

YEAR MONTH DAY RES
2005 1     1   1000
2005 1     2   1001
[...]
2099 12    29  1002
2099 12    30  1003
2099 12    31  1003
    
por steve 23.10.2015 / 12:18

3 respostas

3

com awk :

awk '{a=$0}1; END{$0=a; if($1==2099&&$2==12&&$3==30){$3=31;print}}' file | column -t
  • r=$0 define a variável a para toda a linha.
  • 1 uma condição verdadeira em que todas as linhas são impressas
  • END{...} esse bloco é executado quando todas as linhas são processadas
    • $1==2099&&$2==12&&$3==30 se a última linha foi 30 de dezembro de 2099 (o 13 está faltando)
    • $3=31 definiu o dia para 31
    • print e imprima essa linha adicional.
  • column -t é colocar em coluna a lista.

O resultado com o seu arquivo de entrada:

YEAR  MONTH  DAY  RES
2005  1      1    1000
2005  1      2    1001
...
2099  12     29   1002
2099  12     30   1003
2099  12     31   1003
    
por 23.10.2015 / 12:40
1

O script adiciona a todos os arquivos table que têm 30 na última linha, seguido de 2 espaços e 4 símbolos RES da nova linha com 2099 12 31 RES(from line before) :

sed -i '$ s/30\(  ....\)$/&\n2099 12    31/' table*
    
por 23.10.2015 / 13:51
1

Supondo que todos os seus nomes de arquivos comecem com table (se não, apenas mude o padrão glob para algo que corresponda a todos eles), você pode fazer:

for file in table*; do
    awk -vi="2099 12    31" '1;END{if($0!=i){print i,$NF}}' "$file" > "$file".new
done

O comando awk define a variável i como a linha ausente. O 1; apenas imprime todas as linhas e o END{} é executado quando o arquivo inteiro é lido. Quando dentro do bloco END{} , $0 será a última linha lida, a última linha do arquivo. Se isso não for igual ao valor de i , imprima i e o último campo (NF) da última linha do arquivo.

    
por 23.10.2015 / 13:40