1 votes

supprimer la 2ème ligne de la sortie en utilisant awk

J'obtiens le résultat suivant :

Filename:xxxxxxxx
date: 2014/12/24 14:46:41;  author: xxxxx;  state: Exp;  lines: +210 -206
date: 2014/11/18 21:00:43;  author: xxxxx;  state: Exp;  lines: +617 -594
revision 1.23

Si je vois les 2 dates : dans la sortie, je veux supprimer cette ligne entière de la sortie. La deuxième ligne est là si le développeur a ajouté un numéro de bogue et une explication, mais dans beaucoup d'anciennes vérifications, il ne l'a pas fait, donc il prend la date de la vérification précédente. J'aimerais que l'awk supprime toute deuxième occurrence de date : ainsi que la ligne entière de texte derrière.

Je fais donc un grep date|awk 'FNR <3' pour obtenir le texte que je veux, mais j'aimerais soit le repasser dans awk pour effacer la deuxième ligne de date, soit le combiner en une seule commande awk si possible.

Merci !

0voto

A.B. Points 84870

Utilisation de awk et un fichier d'entrée avec le nom foo

awk '! /^date/ {print} /^date/ && ! a {a=1; print}' foo

Sortie

Filename:xxxxxxxx
date: 2014/12/24 14:46:41;  author: xxxxx;  state: Exp;  lines: +210 -206
revision 1.23

Si vous avez plus d'un bloc de Filename revision dans un seul fichier, par exemple

Filename:xxxxxxxx
date: 2014/12/24 14:46:41;  author: xxxxx;  state: Exp;  lines: +210 -206
date: 2014/11/18 21:00:43;  author: xxxxx;  state: Exp;  lines: +617 -594
revision 1.23
Filename:xxxxxxxx
date: 2014/12/24 14:46:41;  author: xxxxx;  state: Exp;  lines: +210 -206
date: 2014/11/18 21:00:43;  author: xxxxx;  state: Exp;  lines: +617 -594
revision 1.23

vous devez utiliser

awk '! /^date/ {a=0; print} /^date/ && ! a {a=1; print}' foo

pour obtenir

Filename:xxxxxxxx
date: 2014/12/24 14:46:41;  author: xxxxx;  state: Exp;  lines: +210 -206
revision 1.23
Filename:xxxxxxxx
date: 2014/12/24 14:46:41;  author: xxxxx;  state: Exp;  lines: +210 -206
revision 1.23

0voto

ieplugin Points 216

Je sais que la question demande spécifiquement une solution AWK, mais voici une alternative utilisant Perl :

perl -ne 'if(/^date/){$x ne 0?$x=0:next}print' in
  • if(/^date/){[...]} : si la ligne en cours commence par un date exécute les instructions contenues dans [...] ;
  • $x ne 0?$x=0:next : si x n'est pas égal à 0, définit x à 0 ; sinon passe à la ligne suivante ;
  • print : imprime la ligne en cours

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X