Je veux supprimer toutes les lignes sauf la ou les lignes contenant le motif correspondant.
Voici comment je l’ai fait:
sed -n 's/matchingpattern/matchingpattern/p' file.txt
Mais je suis juste curieux parce que je renomme le motif correspondant au motif correspondant lui-même. On dirait un gaspillage ici.
Y a-t-il une meilleure manière de faire cela?
sed '/pattern/!d' file.txt
Mais vous réinventez grep
ici.
Cela pourrait fonctionner pour vous:
sed -n '/matchingpattern/p' file.txt
/.../
est une adresse pouvant comporter des actions jointes dans ce cas p
.
Au lieu d’utiliser sed, ce qui est compliqué, utilisez grep.
grep matching_pattern file
Cela devrait vous donner le résultat souhaité.
grep est certainement meilleur … car il est beaucoup plus rapide.
par exemple en utilisant grep pour extraire toutes les données de séquence du génome pour le chromosome 6 dans un dataset avec lequel je travaille:
$ time grep chr6 seq_file.in > temp.out real 0m11.902s user 0m9.564s sys 0m1.912s
par rapport à sed:
$ time sed '/chr6/!d' seq_file.in > temp.out real 0m21.217s user 0m18.920s sys 0m1.860s
Je l’ai répété 3 fois et ~ les mêmes valeurs à chaque fois.