Awk : tri de fichier et recuperation de ligne

Fermé
flora806 - 7 mars 2008 à 15:28
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 7 mars 2008 à 16:53
Bonjour,
j'utilise AWK et je voudrais effectuer un tri à partir d'un fichier txt sous forme de:
client 1;produit1;val
client 1;produit2;val
client 1;produit3;val
client 1;produit4;val
client 1;produit5;val
.....
client 2;produit1;val
client 2;produit2;val
client 2;produit3;val
....
mon tri consiste à trier par client et par val (récupérer les val supérieures) et afficher uniquement les 10 premières lignes par client:
j'ai utilisé la commande suivante:
$ awk -F";" ' { print $1,$2,$3 } ' C:/data.txt | sort -n -k 1 -r -k 3| head -n 10| cat > C:/dataTri.txt

cette commande permet uniquement d'afficher les 10 résultats triés pour un seul client et non pas pour TOUS les clients.
Merci pour votre aide.

4 réponses

ctiti60 Messages postés 1017 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 27 mai 2021 70
7 mars 2008 à 15:37
Salut,

Si j'ai bien compris, tu veux les 10 val supérieurs pour le client1 et pour le client 2, ... ?
0
oui tout à fait, je veux récupérer les 10 val supérieures pour chaque client.
0
ctiti60 Messages postés 1017 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 27 mai 2021 70
7 mars 2008 à 15:48
Sauf si mon shell est trop rouillé, si tu fais un head -n 10 , tu ne pourras avoir que 10 résultats à l'écran donc comment espères-tu avoir 10 * nb clients lignes en sortie ?

Soit découpes ton fichier en autant de client soit il va falloir faire un script un peu plus compliqué à mon avis.
0
à part la commande "head" en AWK il n'y a pas d'autre commande qui pourrait m'afficher les 10*client?
0
ctiti60 Messages postés 1017 Date d'inscription lundi 22 octobre 2007 Statut Membre Dernière intervention 27 mai 2021 70
7 mars 2008 à 16:12
En fait, tu essayes de faire ce que les bases de données font. La solution ne sera pas si facile et je ne sais pas si un enchainement de commandes de type shell va pouvoir résoudre ton problème.

Ton raisonnement est bon pour un client. Il faudrait que tu découpes ton fichier client par client puis que tu utilises ta commande sur chaque fichier.

Il y a certainement d'autres solutions, mais c'est tout ce que j'ai tout de suite là
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
7 mars 2008 à 16:53
Salut,

Essaie ça :
while read line
do
grep "$line" C:/data.txt | sort -n -k 1 -r -k 3 | head -n 10 >> C:/dataTri.txt
done < <(awk -F";" '{ print $1 }' C:/data.txt | sort -u)
;-))
0