Comment puis-je filtrer un motif de ligne avec sed?

Supposons que je dispose d’un script shell, foo.sh , qui produit des jeux de données répétitifs comme ceci:

  
...

Je veux extraire les 1ère et 3ème lignes de chaque bloc de 5 lignes, de sorte que la sortie modifiée ressemble à ceci:

     ... 

Le problème est qu’il n’ya pas de modèle unique pour ces lignes, donc je dois filtrer en fonction des numéros de ligne. Comment cela peut-il être fait?

Utiliser GNU sed:

 sed -n '1~5p;3~5p' file.txt 

A partir du manuel GNU sed:

 first~step Match every step'th line starting with line first. For example, ``sed -n 1~2p'' will print all the odd-numbered lines in the input stream, and the address 2~5 will match every fifth line, starting with the second. first can be zero; in this case, sed operates as if it were equal to step. (This is an extension.) 

Je ne suis pas un expert en sed , mais vous pouvez le faire dans Awk:

 $ awk '(i==0 || i==2) { print } { i = (i+1) % 5 } ' < filename.txt 

Ou dans une ligne

 $ awk '(NR%5==1 || NR%5==3)' < filename.txt 

Pouvez-vous utiliser awk ?

 awk 'NR % 5 == 1 || NR % 5 == 3' foofile 

Donc, fondamentalement, ce qui se passe est

  • awk ouvre foofile.
  • il lit à travers elle ligne par ligne
  • le numéro de ligne est divisé par cinq et si le rest est 1 ou 3 (c’est-à-dire la première ou la troisième ligne dans un bloc de 5), il imprime cette ligne

Cela pourrait fonctionner pour vous:

 sed -n 'h;n;n;H;n;n;g;p' file