awk différences par paires

Je rencontre souvent ce problème avec des données, si j'ai des entiers, je veux souvent regarder les différences entre les entiers adjacents, je résous généralement cela en Ruby ou en Python, mais je pense qu'une telle chose pourrait être faite dans awk, et je Je préfère ça.

J'ai un tableau de données tel que:

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

Et je voudrais find les différences adjacentes, c'est-à-dire:

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

J'ai trouvé la fonction getline dans la page de getline awk, mais je n'ai pas pu l'utiliser avec succès.

Cette ligne unique produit la sortie avec les signes less:

 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 

Cette version montre les différences réelles:

 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 

Dans les deux cas, le programme awk commence par une option pour définir le séparateur de champs sur une virgule ( -F, ). Ensuite, pour chaque ligne du file, une instruction if est exécutée: si nous dépassons la première ligne (( NR>1 ), les différences sont imprimées, les deux commands suivantes ( a=$1 ; b=$2 ) qui stocke les dernières valeurs.

Pas besoin de getline. Il suffit de garder la trace des colonnes du script AWK, par exemple

 #!/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) } } 

Je suppose que vous voulez postr "thisline_field1-lastline_field1, thisline_field2-lastline_field2" comme une string littérale; si vous voulez soustraire, il serait print $1 - old[1] "-" $2 - old[2]