Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
[shell] tri multicolonnes
Envoyé par: restecool

j'ai un fichier de 62 caracteres et xxxxxxxxxx lignes.
il ne se compose que de chiffres et de lettres.
il 7 colonnes et je voudrais faire un tri sur 2 colonnes.

colonne1=19 caracteres
colonne2=2 caracteres
colonne3=5 caracteres
colonne4=6 caracteres
colonne5=6 caracteres
colonne6=9 caracteres
colonne7=15 caracteres

ce qui doit etre fait:
tri croissant sur colonne2 puis colonne5 (en gardant les autres colonnes) >dans fichierOUT1

ensuite
de fichierOUT1 il me faut un seul enregistrement par type de la colonne 2 et ajouter le nombre à la colonne6


fichier: (colonne2 et colonne5 en gras)
00000000000000000001100000000000ZZZ BC000000001000000000000000
00000000000000000001700000000000ZZZ AC000000001000000000000000
00000000000000000001100000000000ZZZ EC000000001000000000000000
00000000000000000001400000000000ZZZ AC000000001000000000000000
00000000000000000001700000000000ZZZ AC000000001000000000000000
00000000000000000001100000000000ZZZ AC000000001000000000000000
00000000000000000001700000000000ZZZ AC000000001000000000000000

example :fichierOUT voulu
tri sur colonne2 puis sur colonne5
00000000000000000001100000000000ZZZ AC000000001000000000000000
00000000000000000001100000000000ZZZ BC000000001000000000000000
00000000000000000001100000000000ZZZ EC000000001000000000000000
00000000000000000001400000000000ZZZ AC000000001000000000000000
00000000000000000001700000000000ZZZ AC000000001000000000000000
00000000000000000001700000000000ZZZ AC000000001000000000000000
00000000000000000001700000000000ZZZ AC000000001000000000000000

ensuite avec ce fichier, on enleve les enregistrements en doubles et pour chaque enregistrement enlevé on incrémente la colonne6

example :fichierOUT2
la il y avait 3 lignes identiques (colonne2 soit "17" et colonne5 "ZZZ AC") donc on ajoute 2 colonne6
00000000000000000001100000000000ZZZ AC000000001000000000000000
00000000000000000001100000000000ZZZ BC000000001000000000000000
00000000000000000001100000000000ZZZ EC000000001000000000000000
00000000000000000001400000000000ZZZ AC000000001000000000000000
00000000000000000001700000000000ZZZ AC000000003000000000000000


je bloque un peu et un coup de main me serait d'un grand secours.
merci


Poste le Thursday 17 April 2008 15:50:20
Répondre     Citer    
Re: [shell] tri multicolonnes

Citation
Basile STARYNKEVITCH
man sort
cf. aussi : man uniq
?

Poste le Thursday 17 April 2008 22:06:10
Répondre     Citer    
Re: [shell] tri multicolonnes
Envoyé par: pgas

 sort -k1.19,1.21n -k1.33,1.39 fichier1 \ 
| awk 'NR==1{ligne=$0;count=1} 
      NR>1{  if ($0 == ligne) 
                    {count++} 
             else {
              printf "%s%09d%s\n",substr(ligne,1,39),count,substr(ligne,48,62); 
              ligne=$0;count=1}}
      END {printf "%s%09d%s\n",substr(ligne,1,39),count,substr(ligne,48,62)}'

désolé pour l'indentation...

Poste le Thursday 17 April 2008 22:32:15
Répondre     Citer    
Re: [shell] tri multicolonnes
Envoyé par: pgas

hmmm, il y a un espace?
le 2eme serait donc plutot: -k1.33,2.2
(sauf si on change le separateur avec un truc genre -t @ )

Poste le Friday 18 April 2008 06:49:36
Répondre     Citer    
Re: [shell] tri multicolonnes
Envoyé par: restecool

cOOOl
je test ça de suite
merci

Poste le Friday 18 April 2008 10:12:56
Répondre     Citer    
Re: [shell] tri multicolonnes
Envoyé par: restecool

Alors là respect.

pour moi je pense que c'est bon, j'attend maintenant que l'on me valide le résultat.

je suis parti sur le
sort -k1.20,1.21n -k1.33,2.2
oui, c'est 20 car la colonne 1 fait 19 caractères (j'ai bien appris la leçon [lea-linux.org] )

donc voici le batch:
#! /bin/bash
#################################################
#
#################################################
REP_COURANT=${1-`pwd`}
export FICHIER=FICIN.EXP

# colonne1=19
# colonne2=2
# colonne3=5
# colonne4=6
# colonne5=6
# colonne6=9
# colonne7=15

# tri croissant sur colonne2 puis colonne5
sort -k1.20,1.21n -k1.33,2.2 $REP_COURANT/$FICHIER >$REP_COURANT/TRI1_$FICHIER

# tri croissant sur colonne2 puis colonne5 cumul
sort -k1.20,1.21n -k1.33,2.2 $REP_COURANT/$FICHIER | awk 'NR==1{ligne=$0;count=1}
NR>1{
  if ($0 == ligne)
    {count++}
  else {
    printf "%s%09d%s\n",substr(ligne,1,39),count,substr(ligne,48,62);
    ligne=$0;count=1}
}
END {printf "%s%09d%s\n",substr(ligne,1,39),count,substr(ligne,48,62)}' >$REP_COURANT/TRI1_CUMUL_$FICHIER

Mon fichier de test a 4877 lignes
Mon fichier TRI1 a 4877 lignes
Mon fichier TRI1_CUMUL a 4792 lignes

temps d'exécution = inférieur à la seconde

Un grand merci

Poste le Friday 18 April 2008 11:30:51
Répondre     Citer    
Re: [shell] tri multicolonnes

Je ne comprend pas à quoi sert
REP_COURANT=${1-`pwd`}
S'il ne s'agit que d'une substitution de commande, c'est plutôt
REP_COURANT=$(pwd)
...
(?)

Poste le Friday 18 April 2008 16:21:32
Répondre     Citer    
Re: [shell] tri multicolonnes
Envoyé par: voila

`pwd` est la meme chose que $(pwd), `` est plus ancien et présente des désavantages
par rapport à $( ), l'utilisation de `` n'est conseillée que dans le cas où l'on
souhaite une compatibilité maximum avec des shells anciens pre-posix (genre le /bin/sh de solaris)

${variable-word} est remplacée par le contenu de variable, si variable a une valeur
ou par word vi variable n'est pas configurée.

${1-`pwd`} est remplacée par la valeur du premier argument du script, sauf si le script n'a pas été
appelé avec un argument auquel cas elle rest remplacée par le répertoire courant

Poste le Sunday 20 April 2008 22:23:37
Répondre     Citer    
Re: [shell] tri multicolonnes

Ah oui! J'avais oublié. #%b
Et je ne l'avais jamais vu avec des commandes... alors ça m'a paru étrange.

merci voila

Poste le Monday 21 April 2008 04:57:21
Répondre     Citer    
Re: [shell] tri multicolonnes
Envoyé par: restecool

je reviens sur cette demande car ma demande revient après une longue période d'attente.
donc maintenant j'ai pour le moment 21 tris de fichiers à faire sur des fichiers différents avec quelques complications :+)

pour le moment je vais partir sur de fichiers sans blanc pour bien comprendre.

exemple sur le fichier AAA
tri a partir du caractere 37 sur 6 de long et du caractere 43 sur 2 de long
et cumul sur la colonne caractere 45 sur 6 de long

exemple sur le fichier BBB
tri a partir du caractere 44/6 de long et du caractere 38/6 de long
et cumul sur la colonne caractere 50/96 de long et 59/15 de long

merci de votre aide

Poste le Tuesday 28 October 2008 11:21:50
Répondre     Citer    
Re: [shell] tri multicolonnes

Les commandes sort et awk devraient aider. Prends le temps de consulter leur documentation.

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Tuesday 28 October 2008 12:53:12
Répondre     Citer    
Re: [shell] tri multicolonnes
Envoyé par: restecool

Citation
Basile STARYNKEVITCH
Les commandes sort et awk devraient aider. Prends
le temps de consulter leur documentation.

c'est vrai, mais tu dois savoir comme moi que le man de linux n'est pas des meilleurs.
En effet, si tu vas voir un Unix genre Aix ou autres, tu verras que dans le man il y a des examples qui complètent ce qui est dit. Et un example vaut bien 10 explications :+)


Poste le Thursday 30 October 2008 10:41:44
Répondre     Citer    
Re: [shell] tri multicolonnes

Le info de gawk est pas mal et avec plein d'exemples. C'est vrai que j'ai appris awk par son man dans SunOS3. Ca trahit mon grand âge!

----

Basile STARYNKEVITCH

Membre de l'APRIL « promouvoir et défendre le logiciel libre » - adhérez vous aussi à l'APRIL!

Projet logiciel libre: RefPerSys

Poste le Thursday 30 October 2008 13:20:38
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
[shell] tri multicolonnes
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons