#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)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
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 !
Connected \o/
Welcome to sHell. · eval is evil.
En 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
et comme tu dis, c'est facultatif, pas interdit XD
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne