2010-12-09 40 views
1

Salut J'ai mon fichier d'entrée avec un champ:scénario Awk pour retranchant du champ ci-dessus

30 
58 
266 
274 
296 
322 
331 

J'ai besoin que la sortie soit la différence de 2e et 1er rangs (58-30 = 28) et 3e et 2e rangs (266-58 = 208) et ainsi de suite. ma sortie devrait ressembler à ceci:

30 30 
58 28 
266 208 
274 8 

toute aide s'il vous plaît?

+0

Faut-il être awk? –

+0

Eh bien, il peut être n'importe quoi. Mais je pensais juste que ce devrait être une chose simple awk. – Vijay

Répondre

1
data=`cat file | xargs` 
echo $data | awk '{a=0; for(i=1; i<=NF;i++) { print $i, $i-a; a=$i}}' 

30 30 
58 28 
266 208 
274 8 
296 22 
322 26 
331 9 

mise à jour sur un commentaire Sans cat/xargs:

awk '{printf "%d %d\n", $1, $1-a; a=$1;}' file 
+1

C'est une façon vraiment compliquée de lire le fichier. Pourquoi pas "awk" {print $ 1, $ 1-a; a = $ 1} 'fichier' ?? –

+0

@glenn parce que 'awk '{imprimer $ 1, $ 1-a; a = $ 1} 'fichier' ne fonctionne pas sur mon awk :) Mise à jour, merci. – khachik

+0

@glenn: Vous devriez publier le vôtre en réponse parce que c'est le bon. khachik: Quelle est la version de awk et que fait le script de glenn quand vous l'exécutez. C'est * très * basique AWK et devrait fonctionner sur n'importe quelle version. –

1

Vous n'avez pas besoin en fait la boucle de la réponse de Khachick que Awk passera par toutes les lignes de toute façon. Est simple:

cat file | awk '{ BEGIN { a=0 }; { print $1, $1-a; a=$1 }' 

Cependant, il est également possible de sauter la première ligne que vous ne voulez pas vraiment en initialisant une variable dans le bloc BEGIN et ne pas faire l'impression si la variable est si initialisés avant de changer sa valeur . Un peu comme:

BEGIN { started=0 }; { if(0 == started) { started = 1 } else { print $1, $1-a } } 
+2

Utilisation inutile de cat: placez le nom de fichier comme paramètre sur awk. En outre, vous n'avez pas besoin de déclarer explicitement 'a = 0' - une variable non initialisée a implicitement la valeur 0. –

+0

Habit. J'ai d'habitude besoin de lancer sed plusieurs fois sur le contenu du fichier et ensuite avoir un énorme programme awk, donc c'est plus clair et plus facile de l'écrire en utilisant "cat fichier" au début. Je ne savais pas que les variables étaient initialisées à 0, en plus je suis un programmeur de contrôleur C freak :) J'aime que ce soit explicite. – AlastairG

+0

Vous n'avez même pas besoin d'utiliser une variable de votre choix. AWK en fournit un pour cela: 'NR'. Donc vous pouvez faire 'NR> 1 {print $ 1, $ 1-a} {a = $ 1}'. En passant, cette assignation est manquante dans votre second exemple (vous pouvez aussi utiliser 'a' pour le double devoir au lieu de' started'). –