2011-01-19 2 views
0

Supposons que j'ai un script shell, foo.sh, qui produit la répétition des ensembles de données comme ceci:Comment filtrer un motif de ligne avec sed?

<name 1> 
<address 1> 
<mother's name 1> 
<pet's name 1> 
<comment 1> 
<name 2> 
<address 2> 
<mother's name 2> 
<pet's name 2> 
<comment 2> 
... 

Je veux extraire les 1er et 3e lignes de chaque bloc de 5 lignes, de sorte que la sortie modifiée ressemble à ceci Le hic, c'est qu'il n'y a pas de motif unique à ces lignes, donc j'ai besoin de filtrer spécifiquement par numéro de ligne. Comment cela peut-il être fait?

Répondre

4

En utilisant GNU sed:

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

De GNU sed manuel:

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.) 
+0

Une brève explication sur ce que fait cette ligne (que signifient les nombres magiques et l'argument) sera très bénéfique –

3

Je ne suis pas un expert sed, mais vous pouvez le faire en 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 
+0

Cela a fonctionné, merci. – suszterpatt

+0

+1 pour le deuxième exemple. Notez qu'il n'est pas nécessaire d'utiliser la redirection. AWK accepte les noms de fichiers en tant qu'arguments. –

1

Peut-on utiliser awk?

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

Donc, fondamentalement, ce qui se passe est

  • awk ouvre foofile.
  • il lit par ligne par ligne
  • le numéro de ligne est divisée par cinq, et si le reste est égal à 1 ou 3 (à savoir la première ou la troisième ligne dans un bloc de 5), alors il imprime cette ligne
+0

Il serait plus clair si le code comprenait un "1" et un "3". –

+0

Assez juste - modifié – jcuenod

0

Cela pourrait fonctionner f ou vous:

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