# Bash: comment supprimer les doublons d'un tableau indicé?

**URL:** <https://www.debian-fr.org/t/bash-comment-supprimer-les-doublons-dun-tableau-indice/91407>\
**Category:** Programmation\
**Created:** [Août 10, 2025, 11:29 UTC](https://www.debian-fr.org/t/bash-comment-supprimer-les-doublons-dun-tableau-indice/91407 "2025-08-10T11:29:16Z")\
**Posts on this page:** 6\
**Page:** 2

<div class="post-metadata">

**Author:** ![Zargos](https://www.debian-fr.org/user_avatar/www.debian-fr.org/zargos/32/10889_2.png) [@Zargos](https://www.debian-fr.org/u/Zargos)\
**Post date:** [Août 11, 2025, 6:37 UTC](https://www.debian-fr.org/t/bash-comment-supprimer-les-doublons-dun-tableau-indice/91407/21 "2025-08-11T18:37:31Z")

</div>

C’est une mauvaise habitude 🙂

---

<div class="post-metadata">

**Author:** ![Verner](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/34f0e0/32.png) [@Verner](https://www.debian-fr.org/u/Verner)\
**Post date:** [Août 12, 2025, 8:55 UTC](https://www.debian-fr.org/t/bash-comment-supprimer-les-doublons-dun-tableau-indice/91407/22 "2025-08-12T08:55:11Z")

</div>

> [@vbreton](#):
>
> La documentation d’Awk comporte pas moins de 611 pages dans sa version PDF. Dès que vous avez un tableau ou il y a des colonnes à inverser, awk doit être un réflexe au moins pour des essais.

Le réflexe doit plutôt être d’analyser précisément le contenu à traiter pour identifier la commande juste nécessaire. Dans le cas présent, pas besoin de awk.

Fonction **cdp** :

```auto
cdp() { [-d "$1"] && cd $1 && pushd $1 || echo "$1 n'est pas un répertoire" ;}

```

TEST:

```auto
$ dirs -c
$ for x in usr etc boot etc usr ; do cdp /$x ; done

$ dirs
  /usr /usr /etc /boot /etc /usr

$ dirs -p | sort -u
  /boot
  /etc
  /usr

```

---

<div class="post-metadata">

**Author:** ![vbreton](https://www.debian-fr.org/user_avatar/www.debian-fr.org/vbreton/32/11400_2.png) [@vbreton](https://www.debian-fr.org/u/vbreton)\
**Post date:** [Août 12, 2025, 11:32 UTC](https://www.debian-fr.org/t/bash-comment-supprimer-les-doublons-dun-tableau-indice/91407/23 "2025-08-12T11:32:37Z")

</div>

> [@Verner](#):
>
> Le réflexe doit plutôt être d’analyser précisément le contenu à traiter

Oui @Verner, sous réserve qu’un jeu d’essai soit fourni. Ce qui a été fait mais trop tardivement. A la place on a eu au départ seulement un script pas des plus courts ou des plus lisibles pour ce genre de problème.

---

<div class="post-metadata">

**Author:** ![Verner](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/v/34f0e0/32.png) [@Verner](https://www.debian-fr.org/u/Verner)\
**Post date:** [Août 13, 2025, 8:48 UTC](https://www.debian-fr.org/t/bash-comment-supprimer-les-doublons-dun-tableau-indice/91407/24 "2025-08-13T08:48:35Z")

</div>

Effectivement, un problème bien posé est déjà à moitié résolu. C’est vrai dans tous les domaines.  
Il faut parfois deviner quel est le réel sujet, lorsque son titre ne reflète pas précisément la description du problème, qui n’est pas dans le cas présent un problème général de ‹&nbsp;tableau indicé&nbsp;›, mais juste une liste de répertoires.  
Plus généralement, **awk** est bien sûr l’outil adapté pour le traitement de tableaux, ou de contenu beaucoup plus complexe.  
**awk** est ultra-puissant (comme **sed** ), mais demande un effort initial non négligeable (_pour ne pas dire important_) pour pénétrer son univers impitoyable, et sa logique pas immédiate.  
On voit dans les messages précédents qu’on peut vite bloquer sur un problème de virgule déjà pour une opération très simple.

Concernant l’usage de ‹&nbsp; **dirs / pushd** &nbsp;›, un script n’est pas adapté puisque l’environnement du terminal en cours d’usage ne sera pas directement interprété par le script. Exporter des variables ‹&nbsp;builtin&nbsp;› vers un script est confus et inutile.

Pour résumer, la fonction suivante permet de:  
1 - changer de dossier en le mémorisant;  
2 - ‹&nbsp; **-n** &nbsp;› : compter le nombre de dossiers enregistrés;  
3 - signaler en cas d’erreur de nom de dossier;  
4 - sans argument, affiche la liste filtrée/triée des dossiers enregistrés.

```auto
cdp() { if [-z "$1"] ; then dirs -p | sort -u
      elif [$1 = '-n'] ; then dirs -p | sort -u | sed -n '$='
      elif [-d $1] ; then pushd $1 >/dev/null
      else echo "$1 n'est pas un répertoire"
        fi
}

```

Ou en version plus compacte avec affichage total nombre de dossiers uniques enregistrés, en absence d’argument::

```auto
cdp() { [-d "$1"] && pushd $1 >/dev/null && return
        ["$1"] && echo "$1 n'est pas un répertoire" || \
        dirs -p | sort -u | awk '1;END {print "T = "NR}'
}

```

* * *

Quelques observations complémentaires:  
• le problème de l’usage de ‹&nbsp; **sort** &nbsp;› est qu’il casse la chronologie des dossiers;  
• ‹&nbsp; **pushd** &nbsp;› remplit la pile de dossiers par le haut, alors qu’il semble plus naturel que le dernier dossier atteint soit le dernier.

La version suivante propose un comportement plus naturel.

```auto
cdp() { [-d "$1"] && pushd $1 &>/dev/null && return
        ["$1"] && echo "$1 n'est pas un répertoire" || dirs -p |
        awk '!_[$1]++' | tac | awk '{print NR,$0}'
}

```

TEST:

```auto
$ dirs -c
$ for x in usr etc usr etc boot home boot ; do cdp /$x ; done

$ cdp
  1 /usr
  2 /etc
  3 /home
  4 /boot

```

edit: `dirs -lp` compris en zsh, mais pas par bash.

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Août 15, 2025, 11:37 UTC](https://www.debian-fr.org/t/bash-comment-supprimer-les-doublons-dun-tableau-indice/91407/25 "2025-08-15T11:37:17Z")

</div>

Merci à tous les trois, vous m’avez conduit bien au delà de mes espérances naïves.

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Août 20, 2025, 7:17 UTC](https://www.debian-fr.org/t/bash-comment-supprimer-les-doublons-dun-tableau-indice/91407/26 "2025-08-20T19:17:22Z")

</div>

> [@Zargos](#):
>
> C’est une mauvaise habitude

Pourquoi?  
Un alias n’est-il pas un simple texte recopié sur la ligne de commande à son appel?  
Que peut faire un pipe, un enchainement de commandes qui soit différent d’une frappe manuelle, plus longue et surtout plus exposée à une erreur?

[Page précédente](https://www.debian-fr.org/t/bash-comment-supprimer-les-doublons-dun-tableau-indice/91407.md?page=1)
