2010-12-05 29 views
1

j'ai les données suivantes définies avec le 3ème champ est composé de 0 et de 1Aide à dupliquer les lignes en fonction d'un champ à l'aide awk

Input 

1 2 1 
2 4 0 
3 3 1 
4 1 1 
5 0 0 

Je souhaite élargir l'ensemble de données au format suivant

  1. en double chaque ligne basée sur le 2ème champ et

  2. Remplacez seulement le « nouveau » 1 de (obtenir après duplication) dans le 3ème champ par 0

Comment est-ce que je peux faire ceci avec AWK?

Merci

Output 
1 2 1 
1 2 0 
2 4 0 
2 4 0 
2 4 0 
2 4 0 
3 3 1 
3 3 0 
3 3 0 
4 1 1 

Répondre

2
awk '{print; $3=0; for (i=1; i<$2; i++) print}' inputfile 

Si vous voulez sauter en fait des enregistrements avec un zéro dans le second champ (comme par exemple semble montrer):

awk '{if ($2>0) print; $3=0; for (i=1; i<$2; i++) print}' inputfile 
+0

Dennis. ça fonctionne bien. Je ne comprends pas très bien l'ordre de la déclaration $ 3 = 0 avant que la duplication ait lieu. BTW, Comment puis-je donner des commentaires sur toute l'aide que j'ai reçu de stackoverflow? – Tony

+0

@Tony: D'abord, l'enregistrement est imprimé, puis le troisième champ est changé à 0, puis l'enregistrement est imprimé autant de fois que la valeur dans le deuxième champ (moins 1, parce que c'est "moins de" '<' au lieu de "inférieur ou égal" '<='). L'enregistrement est donc toujours imprimé une fois (sauf si vous utilisez la version skip-zero). La boucle 'for' ne s'exécute que si' $ 2' est * supérieur à * 1, donc si c'est 0 ou 1 il n'y a pas de doublon. En ce qui concerne les commentaires, il y a plusieurs choses que vous pouvez faire (même en les faisant toutes). Premièrement, accepter et augmenter les réponses. –

+0

@Tony: (suite) Deuxièmement, poser des questions et répondre à des questions (cela fournit en fait des commentaires, à plus d'un titre). Parlez à vos amis, votre famille et vos collègues de SO et des autres sites Stack Exchange (je vois que vous n'êtes pas encore membre de l'un des autres). Faire des billets de blog, des tweets et d'autres mentions de médias sociaux. Utilisez le lien 'link' trouvé sous chaque question lorsque vous reliez à des questions spécifiques - il contient votre numéro d'utilisateur. Participez aux sites Meta et Chat. Participez à la zone 51. Enfin, vous pouvez envoyer un courriel à l'adresse Contact Us au bas de la page. –