Utilisez awk pour insert une ligne après N sortie

J'ai un file text rempli d'un tas de données. J'ai besoin de sortir des lignes contenant des strings spécifiques. J'ai accompli ceci avec awk en utilisant ce qui suit:

awk '/pattern1|pattern2|pattern3/ {print;}' infile 

Je dois ensuite mettre une nouvelle ligne (\ n) après la 3ème ligne. Donc, il devrait ressembler à ceci

 pattern1 pattern2 pattern3 <new line> pattern1... 

J'ai pu accomplir cela en mettant la première command dans une autre instruction awk

 awk -F '\n' '/pattern1|pattern2|pattern3/ { print; }' infile | awk '{ if ((NR % 3) == 1) printf("\n"); print; }' 

Je pense qu'il doit y avoir un moyen plus efficace de le faire, j'ai donc commencé à chercher comment je pouvais combiner les deux commands set. J'ai essayé ce qui suit:

 awk '/pattern1|pattern2|pattern3/ { if ((NR % 3) ==1 ) printf("\n"); print; }' 

Je pensais que cela fonctionnerait mais la sortie est complètement imprévisible, parfois il y a 5 lignes regroupées, des groupes de 2 lignes, mais pas de lignes de 3.

Je pensais qu'il y avait peut-être un problème de délimiteur, alors j'ai essayé de jouer avec l'option -F et de définir l'IFS mais je n'ai pas modifié la sortie.

Je pense que je fais quelque chose de stupide dans la façon dont j'ai essayé de combiner le pattern match avec l'instruction if, mais je n'ai pas été capable de comprendre la combinaison.

Est-ce que j'essaie de faire possible en un seul commandment awk? Et si oui, où est-ce que je me trompe?

Le problème avec votre tentative de solution est que NR de awk est un count des loggings d' input , alors que vous voulez insert la nouvelle ligne basée sur le nombre d'loggings de sortie .

Je ne pense pas que awk garde un tel count nativement, mais vous pourriez faire quelque chose comme

 awk '/pattern1|pattern2|pattern3/ {print; if (++onr%3 == 0) print ""; }' infile 

dans lequel nous définissons une nouvelle variable onr (pour le numéro de sortie de l'logging – le nom de la variable est arbitraire) et incrémentons-le chaque fois que nous apparions / imprimons le text désiré, puis vérifions s'il est divisible par 3.

est-ce que je comprends bien, vous essayez d'inventer

 awk '/pattern1|pattern2/ {print $1;} /pattern3/ {print $1 "\n"}' infile