shell - vide - supprimer la premiere ligne d'un fichier linux




Supprimer des lignes dans un fichier texte contenant une chaîne spécifique (9)

J'ai fait un petit benchmark avec un fichier qui contient environ 345 000 lignes. Le chemin avec grep semble être environ 15 fois plus rapide que la méthode sed dans ce cas.

J'ai essayé à la fois avec et sans le paramètre LC_ALL = C, il ne semble pas changer les timings de manière significative. La chaîne de recherche (CDGA_00004.pdbqt.gz.tar) se trouve quelque part au milieu du fichier.

Voici les commandes et les horaires:

time sed -i "/CDGA_00004.pdbqt.gz.tar/d" /tmp/input.txt

real    0m0.711s
user    0m0.179s
sys     0m0.530s

time perl -ni -e 'print unless /CDGA_00004.pdbqt.gz.tar/' /tmp/input.txt

real    0m0.105s
user    0m0.088s
sys     0m0.016s

time (grep -v CDGA_00004.pdbqt.gz.tar /tmp/input.txt > /tmp/input.tmp; mv /tmp/input.tmp /tmp/input.txt )

real    0m0.046s
user    0m0.014s
sys     0m0.019s

Comment utiliser sed pour supprimer toutes les lignes d'un fichier texte contenant une chaîne spécifique?


Je me débattais avec ça sur Mac. De plus, j'avais besoin de le faire en utilisant un remplacement variable. J'ai donc utilisé:

sed -i '' "/$pattern/d" $file

$file est un fichier où la suppression est nécessaire et $pattern est le motif à rechercher pour la suppression. Choisi le '' de ce comment . La chose à noter ici est l'utilisation de guillemets dans "/$pattern/d" . La variable ne fonctionne pas lorsque nous utilisons un guillemet simple.


Le moyen facile de le faire, avec GNU sed :

sed --in-place '/some string here/d' yourfile

Pour obtenir un résultat inplace avec grep vous pouvez le faire:

echo "$(grep -v "pattern" filename)" >filename


Vous pouvez l'utiliser aussi

 grep -v 'pattern' filename

ici -v n'imprimera que votre motif (ce qui signifie Inverser la correspondance)


Vous pouvez utiliser sed pour remplacer les lignes en place dans un fichier. Cependant, il semble être beaucoup plus lent que d'utiliser grep pour l'inverse dans un second fichier et ensuite déplacer le deuxième fichier sur l'original.

par exemple

sed -i '/pattern/d' filename      

ou

grep -v "pattern" filename > filename2; mv filename2 filename

La première commande prend 3 fois plus de temps sur ma machine.


il y a beaucoup d'autres façons de supprimer des lignes avec des chaînes spécifiques en plus de sed

awk

awk '!/pattern/' file > temp && mv temp file

Rubis (1.9+)

ruby -i.bak -ne 'print if not /test/' file

Perl

perl -ni.bak -e "print unless /pattern/" file

Shell (bash3.2 +)

while read -r line
do
  [[ ! $line =~ pattern ]] && echo "$line"
done <file > o 
mv o file

GNU grep

grep -v "pattern" file > temp && mv temp file

et bien sûr sed (l'impression de l'inverse est plus rapide que la suppression réelle.)

sed -n '/pattern/!p' file 

perl -i    -nle'/regexp/||print' file1 file2 file3
perl -i.bk -nle'/regexp/||print' file1 file2 file3

La première commande édite le (s) fichier (s) inplace (-i).

La deuxième commande fait la même chose mais conserve une copie ou sauvegarde du ou des fichiers d'origine en ajoutant .bk aux noms de fichiers (.bk peut être changé en n'importe quoi).





in-place