Forum Programmation.shell comment trier un fichier en même temps que awk le lit

Posté par  .
Étiquettes : aucune
0
19
déc.
2006
bonjour, merci d'avance pour votre aide ,
je cherche a trier, avec un script en bash, un fichier dont chaque ligne commence par un nombre de 0 à 600 puis une tabulation suivi du restant de la ligne , je souhaiterai le trier en autant de fichier que de nombre différent qui commence chaque ligne.

voici mon ébauche de débutant :

set nb_temp 600

while [$nb_temp]
do
cat resultat.txt | awk -F" " ' $1 ~/^""%3d" ",$nb_temp / {print $0}' >> temp
set nom `"resultat."%s".txt",$nb_temp`
cat temp >> $nom
rm -f temp
nb_temp+= -1
done

Le probleme de cette méthode est que, si elle fonctionnait deja, la boucle lirai 600 fois mon fichier qui fait plusieurs Mega et parai donc obsolète pour ne pas employer de termes grossier.
J'ai une piste sur les scripts awk mais cela reste vague pour le debutant que je suis . Merci d'avance.
  • # sort

    Posté par  (site web personnel) . Évalué à 3.

    Essait de voire si "sort" ne peut pas t'aider.
  • # man sort

    Posté par  . Évalué à 2.

    un :

    sort -t'' -n -k1

    devrait faire l'affaire

    P.S. : remplacer par l'appui sur la touche TAB
    • [^] # Re: man sort

      Posté par  . Évalué à 3.

      Super, je recomence

      un :


      sort -t'< TAB >' -n -k1



      devrait faire l'affaire

      P.S. : remplacer < TAB > par l'appui sur la touche TAB
  • # vive awk!

    Posté par  . Évalué à 2.

    for i in `awk '{print $1}' $1 | sort -n | uniq`; do
    grep $i $1 > resultat.$i.txt
    done

    Sans aucune garantie. Non testé.
    Ca doit être un peu mieux que ce que tu as proposé mais le fichier sera lu encore pas mal de fois.

    Pour faire mieux, il y a ça qui lit le fichier une seule fois:

    awk '{print >> $1}' mon_gros_fichier

    Voir http://www.gnu.org/software/gawk/manual/gawk.html section "4.6 Redirecting Output of print and printf" pour les détails.
    • [^] # Re: vive awk!

      Posté par  . Évalué à 1.

      je cernes mal ou est l'entrée standart ou je fais entrer mon fichier dans la boucle for .
      Et si je veux recup la ligne entière et non que les champs $1, je fais un
      grep $i $0 > resultat.$i.txt ?????

      Merci pour l'info , je bosse la dessus.
      • [^] # Re: vive awk!

        Posté par  . Évalué à 1.

        Tout d'abord, la bonne solution c'est la deuxième que j'ai donné.

        La première solution est un script. Il faut mettre ces trois lignes dans un fichier texte, le rendre exécutable et exécuter ce script avec en argument le nom du fichier à traiter. Alternativement, on peut tout mettre sur une ligne de commande mais il faut alors remplacer $1 par le nom de fichier à traiter, sauf dans awk '{print $1}'. Ca donne ça:

        for i in `awk '{print $1}' mon_gros_fichier | sort -n | uniq`; do grep $i mon_gros_fichier > resultat.$i.txt; done

        La commande grep $i $1 > resultat.$i.txt dans ce script recherche la chaîne $i dans le fichier $1 (l'argument du script), lorsque cette chaîne est trouvée, toute la ligne est affichée et le caractère > redirige la sortie vers un fichier.
  • # A la place de man sort, je ferai un man awk

    Posté par  . Évalué à 3.

    echo "001 ytreza
    002 azerty
    001 poiuyt" | awk '{ out = "result_" $1 ".txt" ; print $0 >> out}'

    print peut être redirigé (section Output Statements)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.