[resolu] Pb de tris par date dans un fichier txt avec plrs séparateurs

Pb de tris par date dans un fichier txt avec plrs séparateurs [resolu] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 20-10-2003 à 15:51:54    

Voilà je sors un rapport omniback donc sous HP UX 11.0 au format txt
 
Les lignes se présentent comme suit (il y en a environ 400) :
 
c1326714:3f45d129:4dbd:0001 [LC0360] [LC0360] [Robot_ATL_01:   104] Good 10/17/03 01:27:34 104266.88 104266.88 10/09/03 22:33:10 1065731590 Robot DLT
 
Il s'agit d'une seule et même ligne.
 
Mon but : faire un tri sur la première date qui apparaît (ici 10/17/03).
 
Ce que j'ai fait :  
more fichier | sort -o fichier_tri -t/ -k3 -k2 -k1
 
Ma question :  
En indiquant le séparateur de champs comme étant le /, ma commande est-elle suffisante ? pour un tri uniquement sur la première date la seconde (ici 10/09/03) ne m'intéressant pas du tout.


Message édité par raistlin72 le 21-10-2003 à 12:00:36
Reply

Marsh Posté le 20-10-2003 à 15:51:54   

Reply

Marsh Posté le 20-10-2003 à 16:10:22    

Si je comprends bien le résultat que tu as obtenu n'est pas correct.
Je ne maitrise pas "sort". Donc les options je ne peux pas te dire si elles sont bonnes. (En plus je ne suis pas sous Linux en ce moment...)
Par contre, je remplacerai bien le 'more' par un 'cat' étant donné que le more marque une pause à chaque page pleine. Si tu as besoin d'une pause, essaye plutôt :
cat fichier | sort ... | more
ou
sort ... < fichier | more

Reply

Marsh Posté le 20-10-2003 à 16:19:53    

En fait je ne sais pas si mon résultat est correct, comme il a 400 lignes à vérifier, c'est un peu long.  
A première vue il paraît correct, mais je n'en ai pas la certitude.
Dans mon cas, more ou cat sont indifférents, je ne cherche qu'une instruction capable de lire un fichier pour rediriger la sortie standard vers le sort qui ne travaille qu'avec une redirection vers son entrée.  
Du coup la pause est invisible car le résultat final est redirigé vers un fichier "fichier_tri".
Ce que je me demande c'est s'il ne fait pas aussi un tri sur la seconde date  et si oui comment cela perturbe le premier tri.
Considère-t-il les champs comme uniquement ce qu'il y a avant le / et non la totalité ce qui se trouve avant.
 
Car s'il prend tout ça pour le premier champs :
c1326714:3f45d129:4dbd:0001 [LC0360] [LC0360] [Robot_ATL_01:   104] Good 10/17/03 01:27:34 104266.88 104266.88 10/09/03 22:33:10 1065731590 Robot DLT
 
Le tri risque d'être gravement faussé, même si je force le tri en numérique par un -n
 

Reply

Marsh Posté le 20-10-2003 à 17:18:31    

Code :
  1. ~ $ cat hfr
  2. c1326714:3f45d129:4dbd:0001 [LC0360] [LC0360] [Robot_ATL_01:   104] Good 10/17/03 01:27:34 104266.88 104266.88 10/09/03 22:33:10 1065731590 Robot DLT
  3. c1326714:3f45d129:4dbd:0001 [LC0360] [LC0360] [Robot_ATL_01:   104] Good 10/19/03 01:27:34 104266.88 104266.88 10/09/03 22:33:10 1065731590 Robot DLT
  4. c1326714:3f45d129:4dbd:0001 [LC0360] [LC0360] [Robot_ATL_01:   104] Good 10/13/03:27:34 104266.88 104266.88 10/09/03 22:33:10 1065731590 Robot DLT
  5. c1326714:3f45d129:4dbd:0001 [LC0360] [LC0360] [Robot_ATL_01:   104] Good 11/07/03 01:27:34 104266.88 104266.88 10/09/03 22:33:10 1065731590 Robot DLT
  6. c1326714:3f45d129:4dbd:0001 [LC0360] [LC0360] [Robot_ATL_01:   104] Good 10/05/03 01:27:34 104266.88 104266.88 10/09/03 22:33:10 1065731590 Robot DLT
  7. ~ $


Code :
  1. ~ $ cat hfr.perl
  2. #!/usr/bin/perl
  3. if( ! open (FILE,"hfr" )) {die;};
  4. {
  5.         foreach $lign (<FILE> )
  6.         {
  7.                 chomp($lign);
  8.                 if ($lign =~ /(\d+)\/(\d+)\/(\d+)/)
  9.                 {
  10.                         $a =  $3.$1.$2;
  11.                 };
  12.                 $b{$a} = $lign;
  13.         };
  14.         foreach $l (sort (keys %b) )
  15.         {
  16.                 print "$b{$l}\n";
  17.         };
  18. };
  19. close (FILE);
  20. ~ $


Code :
  1. ~ $ ./hfr.perl
  2. c1326714:3f45d129:4dbd:0001 [LC0360] [LC0360] [Robot_ATL_01:   104] Good 10/05/03 01:27:34 104266.88 104266.88 10/09/03 22:33:10 1065731590 Robot DLT
  3. c1326714:3f45d129:4dbd:0001 [LC0360] [LC0360] [Robot_ATL_01:   104] Good 10/13/03:27:34 104266.88 104266.88 10/09/03 22:33:10 1065731590 Robot DLT
  4. c1326714:3f45d129:4dbd:0001 [LC0360] [LC0360] [Robot_ATL_01:   104] Good 10/17/03 01:27:34 104266.88 104266.88 10/09/03 22:33:10 1065731590 Robot DLT
  5. c1326714:3f45d129:4dbd:0001 [LC0360] [LC0360] [Robot_ATL_01:   104] Good 10/19/03 01:27:34 104266.88 104266.88 10/09/03 22:33:10 1065731590 Robot DLT
  6. c1326714:3f45d129:4dbd:0001 [LC0360] [LC0360] [Robot_ATL_01:   104] Good 11/07/03 01:27:34 104266.88 104266.88 10/09/03 22:33:10 1065731590 Robot DLT
  7. ~ $


 
 
edit : doit y avoir moyen de faire + simple via sed, awk et cut mais je connais pas.
a+


Message édité par alligator421 le 20-10-2003 à 17:23:30
Reply

Marsh Posté le 20-10-2003 à 17:56:49    

En tout cas merci pour ton aide.

Reply

Marsh Posté le 20-10-2003 à 18:02:19    

Beaucoup plus simple : D ( sous linux )  
 
 sort +7n -n hfr  

Reply

Marsh Posté le 21-10-2003 à 11:57:48    

Malheureusement ça ne marche pas même sous linux, car le tri numérique doit s'appliquer sur les 3 champs date, d'abord l'année puis le mois puis le jour.
 
Le script perl marche tout à fait par contre.
Encore une fois merci à alligator421  :hello:


Message édité par raistlin72 le 21-10-2003 à 11:59:39
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed