Trouver les morceaux de doublons

Résolu/Fermé
nicdu40 Messages postés 25 Date d'inscription jeudi 18 novembre 2010 Statut Membre Dernière intervention 24 février 2020 - Modifié par mamiemando le 26/07/2013 à 11:06
mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 - 26 juil. 2013 à 11:05
Bonjour,

je m'explique:
j'ai un fichier ( pour squid ) assez conséquent, je voudrais afficher les parties de plus de 5 caracteres qui se repètent le plus souvent pour ensuite faire une chaine regex, donc voila:


mon fichier contient par exemple:

advert.bayarea.com
advert.gittigidiyor.com
advert.hi-media.com
adverticum.com
/sites/details/google.fr google.fr/media


je voudrais en sortie :

advert:
advert.bayarea.com
advert.gittigidiyor.com
advert.hi-media.com
adverticum.com


et si possible:

media:
google.fr/media
advert.hi-media.com


j'ai essayé mais je n'y arrive pas ...

while IFS= read -r LINE; do 
cut -c1-5 $LINE
grep "$LINE"   /etc/squid3/banner-ads.acl
done < /etc/squid3/banner-ads.acl


merci de votre aide

ps : il existe peut-etre déja un script qui pourrait me faire automatiquement mes chaines regex, mais j'ai pas trouvé

5 réponses

mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 7 749
25 juil. 2013 à 20:35
Bah tu n'as pas le choix il faut boucler pour chaque valeur de i allant de 1 à a longueur de LINE - 5 et construire ta commande cut :

for i in $(seq 1 $(expr length $LINE))
do
  troncon=$(cut -c$i-$(($i + 5)) $LINE)
  echo $troncon
done


Le problème c'est qu'en suite pour chaque tronçon il faut maintenir un compteur et ça risque de faire pas mal de tronçons... Personnellement je ne ferais pas ce genre de programme en shell, un langage comme python ou awk me paraît plus adapté....
1
mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 7 749
Modifié par mamiemando le 24/07/2013 à 09:53
Je n'ai pas très bien compris ce que tu voulais faire, surtout que visiblement tes 5 caractères peuvent être n'importe où.

Si tu veux les 5 premiers caractères de chaque ligne sans doublon tu peux écrire un truc du genre :

cat /etc/squid3/banner-ads.acl | cut -c 1-5 | sort | uniq


Bonne chance
0
nicdu40 Messages postés 25 Date d'inscription jeudi 18 novembre 2010 Statut Membre Dernière intervention 24 février 2020 1
Modifié par mamiemando le 26/07/2013 à 11:06
oui effectivement , les 5 caractères peuvent etre n'importe ou , c'est pour ça que je pose cette question
dans mon exemple:

while IFS= read -r LINE; do
cut -c1-5 $LINE  <----- cette ligne devrait etre modifiée 
grep "$LINE" /etc/squid3/banner-ads.acl
done < /etc/squid3/banner-ads.acl 


de plus je voudrais qu'en sortie j'ai:

#media:
#google.fr/media
#advert.hi-media.com 


merci quand même
0
nicdu40 Messages postés 25 Date d'inscription jeudi 18 novembre 2010 Statut Membre Dernière intervention 24 février 2020 1
Modifié par mamiemando le 26/07/2013 à 11:06
YES merci
en fait j'avais un probleme avec cut: xxxxx Aucun fichier ou dossier de ce type
mais bon maintenant c'est ok , me reste plus qu'a extraire du resultat les repetitions les plus nombreuses , et c'est bon. merci mamiemando !!!!!

while read LINE
do
for i in $(seq 1 $(expr length "$LINE"))
do  
  troncon=$(echo $LINE | cut -c$i-$(($i + 4)) )
if [ "${#troncon}" -gt 4 ]
then 
#echo "${#troncon}"
  echo "$troncon :"
 grep "$troncon" /etc/squid3/banner-ads.acl
fi
done
done < /etc/squid3/banner-ads.acl



ce qui donne
image :
dam/imp/surfaces/mail_signin/v3/(images|mai)
http://www.google.fr/images/nav_logo132.png
lpdw.free.fr/images/fondbob.jpg
/images/containercut-bg-container.png
/images/header-bg.png
206.165.5.162/images/gcanim.gif
a7corp.com/images/link.php
ad101com-images.adbureau.net
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 7 749
26 juil. 2013 à 11:05
Tu dois pouvoir mémoriser tes compteurs avec ce genre de table de hashage (pour chaque tronçon tu maintiens un compteur) :
https://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash

Bonne chance
0