awk diferenças entre pares

4

Eu me deparo com esse problema muito com dados, se eu tenho alguns inteiros, eu freqüentemente quero olhar para diferenças entre inteiros adjacentes, eu costumo resolver isso em Ruby ou Python, mas acho que isso poderia ser feito no awk e eu preferiria isso.

Eu tenho uma tabela de dados como:

201309,694
201310,699
201311,700
201312,705
201401,713
201402,740

E eu gostaria de encontrar as diferenças adjacentes, isto é:

201310-201309,699-694
201311-201310,700-699
201312-201311,705-700
201401-201312,713-715
201402-201401,740-713

Eu encontrei a função getline na página man do awk, mas não consegui usá-la com sucesso.

    
por tlehman 02.02.2014 / 03:29

2 respostas

5

Este one-liner produz a saída com os sinais de menos:

awk -F, '{if (NR>1) {print $1 "-" a "," $2 "-" b} a=$1 ; b=$2}' numbers
201310-201309,699-694
201311-201310,700-699
201312-201311,705-700
201401-201312,713-705
201402-201401,740-713

Esta versão mostra as diferenças reais:

awk -F, '{if (NR>1) {print $1-a, $2-b } a=$1 ; b=$2}' numbers
1 5
1 1
1 5
89 8
1 27

Em ambos os casos, o programa awk começa com uma opção para definir o separador de campos para uma vírgula ( -F, ). Então, para cada linha no arquivo, uma instrução if é executada: se já passamos da primeira linha ( NR>1 ), então as diferenças são impressas. Os próximos dois comandos ( a=$1 ; b=$2 ) atualizam as variáveis que armazenam os últimos valores.

    
por 02.02.2014 / 03:46
4

Não há necessidade de getline. Basta acompanhar as colunas no script AWK, por exemplo,

#!/usr/bin/awk -f

BEGIN {
    FS="," # We separate on the comma character
}

{
    if(NR > 0) { ## NR is the current line number
            print $1 "-" old[1] "," $2 "-" old[2]
    }
    for(field = 1; field <= 2; field++) {
            old[field] = $(field)
    }
}

Suponho que você queira postar "thisline_field1-lastline_field1, thisline_field2-lastline_field2" como uma string literal; se você quiser subtrair, seria print $1 - old[1] "-" $2 - old[2]

    
por 02.02.2014 / 03:40

Tags