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
Cela pourrait fonctionner pour vous:
sed -n 'h;n;n;H;n;n;g;p' file