2016-03-07 1 views
0

Question N00b: J'ai deux fichiers, tous les deux n'ont que des lignes de plus petite taille et sont triés par ordre alphabétique. "file_A" a plus de 11.000.000 lignes de 6-7 caractères et "file_B" a environ 400.000 lignes ayant 3-4 caractères. Je voudrais supprimer toutes les lignes de "file_A" si elles peuvent être partiellement trouvées contre les lignes de "file_B" (ex: supprimer la ligne "bobcat" ou "catwoman" de "file_A" si elle est cochée par rapport à la ligne "cat" "à partir de" fichier_B "). En ce moment, je peux le faire en utilisant un script simple:Suppression de sous-chaînes à partir d'un fichier en les croisant avec un autre fichier

while read -r line; do 
    sed -i "/"$line"/d" $file_A 
done < $file_B 

Le problème est que le processus est bien moyen trop lent (ou qui est la façon dont je perçois). Il semble que cela prenne un peu de temps avant que temporaire enregistre le fichier A dans le même dossier et le vérifie à nouveau, je suppose, par rapport à la chaîne suivante issue du fichier B. Après 6 heures, je l'ai annulé. Est-ce un moyen de rendre ce processus plus rapide?

J'ai cherché sur le forum une réponse pour répondre. Si cette question a déjà été posée, veuillez me rediriger vers la réponse.

Merci.

Répondre

0

Utilisation grep:

grep -vFf a.txt b.txt > b.modified.txt 
mv b.modified.txt > b.txt 
  • -v matchs seulement les lignes qui ne correspond à un des motifs. Ceci supprime les lignes qui ne correspond à un des motifs

  • -F utilise des chaînes fixes au lieu des expressions régulières

  • -f a.txt modèles de lecture de a.txt