Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

#1 Le 30/11/2012, à 16:49

Bat_Tuc

Supprimer doublon avec awk

Voila j'ai un fichier ( WhoIsOnline) ou sur chaque ligne apparait un mot.
j'aimerais supprimer les doublons or ce que j'ai fais ne marche pas ..
voila ce que j'ai

cat WhoIsOnline |
awk '{
for (i=1;i<=$NF;i++)
{
        nb=0
        for(j=1;j<i;j++) { # je verifie si tous les champs d'avant sont differents
                if ($i == $j) nb++
        }
        if(nb==0) printf $i
}
}'

apres divers test j'ai l'impression que mon i reste a 1 ...

Dernière modification par Bat_Tuc (Le 30/11/2012, à 16:49)


Un jour mon père m' a dit " fils, si ton programme tourne, c est qu il peut faire mieux ..."

Hors ligne

#2 Le 30/11/2012, à 17:02

pingouinux

Re : Supprimer doublon avec awk

Bonjour,

Voila j'ai un fichier ( WhoIsOnline) ou sur chaque ligne apparait un mot.

Peux-tu préciser ? S'il n'y a qu'un mot par ligne, inutile de passer en revue les champs de la ligne.
Si c'est bien le cas, et si l'ordre importe peu :

sort -bu WhoIsOnline >WhoIsOnline.new

En ligne

#3 Le 30/11/2012, à 17:04

Bat_Tuc

Re : Supprimer doublon avec awk

j'ai un seul mot par ligne. L'ordre importe peu.
ta réponse repond donc a mon besoin, mais pourquoi mon awk ne marchait pas  ? sad


Un jour mon père m' a dit " fils, si ton programme tourne, c est qu il peut faire mieux ..."

Hors ligne

#4 Le 30/11/2012, à 17:15

pingouinux

Re : Supprimer doublon avec awk

mais pourquoi mon awk ne marchait pas  ?

Il ne faut déjà pas de $NF sur cette ligne, qui doit être :

for (i=1;i<=NF;i++)

Remarque : Le awk serait plus propre ainsi :

awk '{………}' WhoIsOnline

Dernière modification par pingouinux (Le 30/11/2012, à 17:18)

En ligne

#5 Le 30/11/2012, à 17:16

nesthib

Re : Supprimer doublon avec awk

awk '!_[$0]++' fichier

(si une ligne n'a pas déjà été trouvée on l'affiche)

Comme pingouinux, j'avoue que je comprends mal ton raisonnement du premier message.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#6 Le 30/11/2012, à 17:18

Bat_Tuc

Re : Supprimer doublon avec awk

Enfaite j'ai vraiment du mal avec awk. Je pensais qu'il faisait du traitement sur tout le fichier.
Alors que si j'ai bien compris il fait le traitement ligne par ligne c'est ca ? il va applique mon code a chaque ligne ? Ca explique donc pourquoi i vaut toujours 1 j'ai que un seul champ par ligne ..


Un jour mon père m' a dit " fils, si ton programme tourne, c est qu il peut faire mieux ..."

Hors ligne

#7 Le 30/11/2012, à 17:27

pingouinux

Re : Supprimer doublon avec awk

@nesthib #5 : Joli, mais il y a de quoi dérouter le néophyte…

En ligne

#8 Le 30/11/2012, à 17:47

nesthib

Re : Supprimer doublon avec awk

@pingouinux : c'est un grand classique awk qui utilise une syntaxe idiomatique wink
Pour l'explication, on créé un tableau « _ » qui enregistre le nombre de fois où une ligne est trouvée « _[$0]++ », par défaut si aucune commande n'est lancée awk affiche la ligne actuelle SI le retour d'une action (ici, afficher le contenu de « _[$0] ») est vrai (ici, « _[$0]++ » n'est vrai que si une ligne a déjà été vue, donc « !_[$0]++ » n'est vrai que si une ligne n'a jamais été vue).

@Bat_Tuc : awk fait du traitement par bloc et par champ, par défaut un bloc est une ligne et un champ est un mot. Donc par défaut, oui, awk applique ton code à chaque ligne.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#9 Le 30/11/2012, à 17:50

pingouinux

Re : Supprimer doublon avec awk

Merci nesthib pour l'explication, mais ma remarque était juste anecdotique.

En ligne

#10 Le 30/11/2012, à 21:48

aduxas

Re : Supprimer doublon avec awk

Dans ta commande awk, $NF veut dire:  le contenu du dernier champs de la ligne courante.

Hors ligne

Haut de page ↑