Petit coup de main en bash(lignes dupliquées)

Résolu/Fermé
Shaggy_2_Dope Messages postés 376 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 31 juillet 2008 - 30 juil. 2008 à 16:44
Shaggy_2_Dope Messages postés 376 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 31 juillet 2008 - 31 juil. 2008 à 09:48
Bonjour tout le monde,

voilà j'ai à ma disposition un fichier contenant ce genre de choses :

CYS A 61 - CYS A 335
CYS A 229 - CYS A 213
CYS A 219 - CYS A 214
CYS A 214 - CYS A 219
CYS A 254 - CYS A 304
CYS A 304 - CYS A 254
CYS A 213 - CYS A 229
CYS A 335 - CYS A 61

Il y a 8 lignes mais en fait chaque ligne est "dupliquée" mais pas à l'identique. Je m'explique :
CYS A 61 - CYS A 335 = CYS A 335 - CYS A 61
CYS A 229 - CYS A 213 = CYS A 213 - CYS A 229
...etc

Il n'y a donc que 4 lignes informatives... le reste ne sert pas.

Donc ce que j'aimerais faire c'est ne garder qu'une occurence sur deux, à savoir :
CYS A 61 - CYS A 335
CYS A 229 - CYS A 213
CYS A 219 - CYS A 214
CYS A 254 - CYS A 304

vous pensez que c'est faisable en bash ?

d'avance merci ;)

Shagg

2 réponses

vignemail1 Messages postés 1246 Date d'inscription vendredi 8 octobre 2004 Statut Contributeur Dernière intervention 13 septembre 2019 259
30 juil. 2008 à 16:49
Un truc que tu peux faire, c'est faire une boucle qui met le plus petit en premier (CYS A 229 - CYS A 213 => CYS A 213 - CYS A 229) puis passé le résultat dans la commande unique qui supprime les doublons
Pour mettre le plus petit en premier, tu peux voir avec awk
0
Shaggy_2_Dope Messages postés 376 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 31 juillet 2008 6
31 juil. 2008 à 09:48
merci pour la piste vignemail1 ;)
J'ai procédé de la façon suivante (ce n'est pas la plus élégante je le conçois...) :

soit nb_cyx = nb de lignes dans le fichier ss.dat



for i in $(seq 1 ${nb_cyx});
do
sed -n "${i} p" ss.dat | awk '{print $3,$7}' | tr -s ' ' '\n ' | sort -n | tr -s '\n' ' ' >> ss.dat.tmp
echo ' ' >> ss.dat.tmp
done

cat ss.dat.tmp | awk '{if (x[$0] !="") next ; print $0; x[$0]=$0}' > ss.dat.reor


et voili :)

Shagg
0