Contenu | Rechercher | Menus

Annonce

Toute l'équipe d'ubuntu-fr vous souhaite un joyeux Noël et une bonne et heureuse année 2018.

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 07/09/2016, à 22:05

SamheG

[Résolu] Suppression de "doublons" dans un script

Bonjour à tous,

Je fais appel à vous pour essayer de me débloquer dans un script que j'essaie de mettre en place (je débute en bash).

Soit un fichier contenant les lignes suivantes :

123456789@aaaa
548657846151@aaaa
123456789@bbbb
846584@bbbb

J'ai besoin de "nettoyer" ce fichier en supprimant les doublons ... mais (car il y a toujours un mais) il faut que l'analyse de doublons ne se fasse que sur les caractères avant le "@"
En résumé, mon fichier "nettoyé" doit ressembler à çà :

123456789@aaaa
548657846151@aaaa
846584@bbbb

La ligne "123456789@bbbb" doit être supprimée car les caractères "123456789" apparaissaient déjà en ligne 1

En cherchant du côté de cut et uniq, j'arrive facilement à supprimer ces doublons mais du coup je perds les caractères à partir du "@"
cat monfichier.txt | cut -d'@' -f1 |  uniq

Une idée ? une piste ?

Dernière modification par SamheG (Le 13/09/2016, à 00:23)

Hors ligne

#2 Le 07/09/2016, à 23:26

Compte anonymisé

Re : [Résolu] Suppression de "doublons" dans un script

printf ''>output;for I in $(cat monfichier.txt);do X=$(echo $I|cut -d@ -f1);grep $X output||echo $I>>output;done
cat output

123456789@aaaa
548657846151@aaaa
846584@bbbb

#3 Le 08/09/2016, à 06:23

pingouinux

Re : [Résolu] Suppression de "doublons" dans un script

Bonjour,

$ awk -F@ '{if(! _[$1]) print $0;_[$1]=1}' monfichier.txt 
123456789@aaaa
548657846151@aaaa
846584@bbbb

@SamheG : uniq ne supprime les doublons que s'ils sont sur des lignes consécutives. Il faut trier le fichier auparavant.

Ajouté : Autre solution

$ cut -d@ -f1 monfichier.txt | sort | uniq | join -t@ - monfichier.txt 
123456789@aaaa
548657846151@aaaa
846584@bbbb

Dernière modification par pingouinux (Le 08/09/2016, à 06:45)

Hors ligne

#4 Le 08/09/2016, à 06:51

Hizoka

Re : [Résolu] Suppression de "doublons" dans un script

while read ligne
do
  code=${ligne%%@*}

  if [[ -z $(grep -w "${code}" <<< "${Liste[@]}") ]]
  then
    Liste+=(${code})
    echo "${ligne}"
  fi
done < monfichier.txt 

et si je veux eviter grep

while read ligne
do
  code=${ligne%%@*}
  value="False"

  for item in "${liste[@]}"
  do
    if [[ "${code}" == "${item}" ]] 
    then
       value="True"
       break
    fi
  done

  if [[ "${value}" == "False" ]]
  then
    Liste+=(${code})
    echo "${ligne}"
  fi
done < monfichier.txt 

Dernière modification par Hizoka (Le 08/09/2016, à 16:17)

Hors ligne

#5 Le 13/09/2016, à 00:22

SamheG

Re : [Résolu] Suppression de "doublons" dans un script

Franchement vous êtes des tueurs!

Il m'a fallu pas mal de temps et de recherches pour analyser et comprendre vos réponses mais grâce à vous j'ai appris pas mal de choses.
Merci à vous !

Hors ligne

#6 Le 13/09/2016, à 02:18

Watael

Re : [Résolu] Suppression de "doublons" dans un script

if [[ "${code}" == "${item}" ]] 

les guillemets sont facultatifs entre crochets doubles, et je ne vous parle pas des accolades !


eval, c'est mal.

Hors ligne

#7 Le 13/09/2016, à 07:26

Hizoka

Re : [Résolu] Suppression de "doublons" dans un script

Oui je sais pas c'est une habitude que j'ai pris, toujours faire de la même façon pour éviter les erreurs d’inattention.
Je trouve que ça se lit bien comme ça smile

et comme tu dis, c'est facultatif, pas interdit XD

Hors ligne