awk - simplifique este script

2

Eu tenho um arquivo de texto. Em linhas de números ímpares, dá novas dimensões de elementos-chave de um edifício que estou construindo.

Em linhas numéricas pares, as dimensões antigas são fornecidas.

Meu objetivo é processar este arquivo e produzir para cada elemento a diferença. Basicamente, isso significa subtrair antigos de novos valores. Eu gostaria de fazer isso com o awk porque estou interessado em fazer isso.

Aqui está um par típico de linhas do arquivo de texto que tem 4 colunas:

groundwall-rvsd 0.0     21.8    0.00
groundwall-orig 0.0     20.2    0.00

Aqui está o roteiro que eu coloquei juntos. Foi feito o trabalho que preciso fazer, mas parece um estalido.

awk 'BEGIN{OFS=FS="\t"}
{if(NR%2==1){foo[NR]=$1 OFS $2 OFS $3 OFS $4}else{bar[NR]=$1 OFS $2 OFS $3 OFS $4}} END 
{for(i=1;i<=NR;i++){if(i%2==1){split(foo[i], foosplit, OFS );split(bar[i+1], barsplit, OFS);split(foosplit[1], elemt, "-"); 
print elemt[1] OFS foosplit[2] - barsplit[2] OFS foosplit[3] - barsplit[3] OFS foosplit[4] - barsplit[4]}}}' file.txt

Alguma sugestão sobre uma solução melhor?

A saída é semelhante a esta

groundwall  0   1.6 0
    
por Tom 11.12.2013 / 17:26

1 resposta

5
awk '
    BEGIN {OFS=FS="\t"} 
    {a[NR]=$2; b[NR]=$3; c[NR]=$4} 
    NR%2 == 0 {
        sub(/-orig$/, "", $1)
        print $1, a[NR]-a[NR-1], b[NR]-b[NR-1], c[NR]-c[NR-1]
    }
' file.txt
  • use matrizes separadas para manter os valores, para que você não precise fazer todas as divisões
  • faça a impressão em cada linha com numeração par em vez de no bloco END

Olhando novamente, você nem precisa de um array, apenas lembre-se dos valores da linha anterior:

awk '
    BEGIN {OFS=FS="\t"} 
    NR%2 == 0 {
        sub(/-orig$/, "", $1)
        print $1, a-$2, b-$3, c-$4
    }
    {a = $2; b = $3; c = $4} 
' file.txt
    
por 11.12.2013 / 17:44

Tags