OVH Cloud OVH Cloud

sort -u ?

4 réponses
Avatar
chatiman
Bonjour,

je souhaite trier un fichier du type:
a:a
a:a
a:c

et n'afficher que les ligne uniques d'apres le premier champ avec:
sort -u -t: -k1

cela m'affiche le resultat suivant:
a:a
a:c

l'option -u semble donc comparer les lignes entres elles et non les
champs selectionnés

est-ce exact ?

4 réponses

Avatar
DINH Viêt Hoà

Bonjour,

je souhaite trier un fichier du type:
a:a
a:a
a:c

et n'afficher que les ligne uniques d'apres le premier champ avec:
sort -u -t: -k1

cela m'affiche le resultat suivant:
a:a
a:c

l'option -u semble donc comparer les lignes entres elles et non les
champs selectionnés

est-ce exact ?


sans doute.

tu as la commande uniq pour faire ce que tu souhaites.

--
DINH V. Hoa,

- "Tiens, tu te rappliques avec l'Ibanez ?"
- "Mais vous allez faire quoi avec de la libanaise ?" -- Elodie

Avatar
fredatwork
"DINH Viêt Hoà" a écrit dans le message news:

tu as la commande uniq pour faire ce que tu souhaites.



Je suis curieux de voir la solution que tu proposes avec uniq
( en évitant les choses genre :
sort -t: -k1 nom_fichier | rev | tr -s : ' ' | uniq -1 | tr -s ' ' : | rev
ce qui est d'ailleurs valide uniquement si le nombre de champs est le même
pour chaque ligne
et si le fichier en entrée ne comporte aucun espace ni aucune tabulation,
sinon il faut encore ajouter des tr.
)

J'utiliserais plutôt awk dans ce cas là :

sort -t: -k1 nom_fichier | awk -F':' 'champs1 != $1 {print } { champs1 $1 } '

Avatar
DINH Viêt Hoà

Je suis curieux de voir la solution que tu proposes avec uniq
( en évitant les choses genre :
sort -t: -k1 nom_fichier | rev | tr -s : ' ' | uniq -1 | tr -s ' ' : | rev
ce qui est d'ailleurs valide uniquement si le nombre de champs est le même
pour chaque ligne
et si le fichier en entrée ne comporte aucun espace ni aucune tabulation,
sinon il faut encore ajouter des tr.
)


par contre, ça ne marche qu'avec le gnu uniq :

sort -t:1 -k1 | uniq -t: -W 1

--
DINH V. Hoa,

- "Tiens, tu te rappliques avec l'Ibanez ?"
- "Mais vous allez faire quoi avec de la libanaise ?" -- Elodie

Avatar
Stephane Chazelas
2004-10-06, 07:48(+02), chatiman:
Bonjour,

je souhaite trier un fichier du type:
a:a
a:a
a:c

et n'afficher que les ligne uniques d'apres le premier champ avec:
sort -u -t: -k1

cela m'affiche le resultat suivant:
a:a
a:c

l'option -u semble donc comparer les lignes entres elles et non les
champs selectionnés

est-ce exact ?


Non.

Avec -k1, sort tri a partir du premier champ, donc "a:a" est
avant "a:c". Si tu veux trier de sorte que "a:a" soit exactement
comme "a:c", il faut trier sur le premier champ uniquement:

sort -ut: -k1,1

--
Stephane