2017-09-28 2 views
1

J'ai deux fichiers, un avec environ 100 domaines racine, et un second fichier avec des URL seulement. Maintenant, je dois filtrer cette liste d'URL pour obtenir le troisième fichier qui contient uniquement les URL qui ont des domaines de la liste.Foreach loop in bash

Exemple de liste d'URL:

| URL       | 
| ------------------------------| 
| http://github.com/name  | 
| http://stackoverflow.com/name2| 
| http://stackoverflow.com/name3| 
| http://www.linkedin.com/name3 | 

Exemple de liste de mots:

github.com 
youtube.com 
facebook.com 

Resut:

| http://github.com/name  | 

Mon but est de filtrer ligne entière où URL contient mot spécifique . Voilà ce que j'ai essayé:

for i in $(cat domains.csv); 
do grep "$i" urls.csv >> filtered.csv ; 
done 

Le résultat est étrange, j'ai quelques-uns des liens, mais pas tous ceux qui contiennent des domaines de la racine du premier fichier. Puis j'ai essayé de faire la même chose avec python et j'ai vu que bash ne faisait pas ce que je voulais, j'ai un meilleur résultat avec le script python, mais cela prend plus de temps pour écrire un script python que d'exécuter des commandes bash.

Comment dois-je accomplir cela avec bash en plus?

+2

Voulez-vous utiliser 'bash' pour le traitement de ces fichiers texte? Vous pouvez simplement utiliser 'grep' seul pour cela. – Inian

+0

Quand j'ai essayé ceci: grep "github" urls.csv> github.com J'ai tous les urls github, donc je pense que je fais quelque chose de mal avec pour chaque boucle –

+0

@Spopic: [vous pouvez marquer la réponse comme acceptée en cliquant sur la coche en haut à gauche de cette réponse] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235) –

Répondre

4

En utilisant grep:

grep -F -f domains.csv url.csv 

Résultats des tests:

$ cat wordlist 
github.com 
youtube.com 
facebook.com 

$ cat urllist 
| URL       | 
| ------------------------------| 
| http://github.com/name  | 
| http://stackoverflow.com/name2| 
| http://stackoverflow.com/name3| 
| http://www.linkedin.com/name3 | 

$ grep -F -f wordlist urllist 
| http://github.com/name  | 
+0

Vous devriez utiliser '- F' drapeau aussi pour traiter les chaînes comme littéral et non regexp – Inian

+0

'grep -Fxf domains.csv <(couper -d '[|]' codeforester

+0

@Inian considéré votre suggestion et ajouté, mais toujours sans «-F» il donne envie o/p que veut OP –