The UNIX and Linux Forums  
Bonjour et bienvenu par les États-Unis à la UNIX et Linux Forums! Merci de votre visite et vous joindre à notre communauté mondiale.

Go Back   Les systèmes UNIX et Linux Forums > Top Forums > De programmation et de script Shell
.
google unix.com



De programmation et de script Shell Posez vos questions à propos de KSH, CSH, SH, BASH, PERL, PHP, SED, awk et d'autres scripts shell et les langages de script shell ici.

Plus d'UNIX et Linux Forum Sujets Vous trouverez peut-être utile
Fil Thread Starter Forum Réponses Last Post
comment convertir des fichiers de longueur fixe fichier délimité. satyam_sat De programmation et de script Shell 7 04-03-2008 03:41 AM
Conversion d'un fichier délimité à largeur fixe fichier raghavan.aero De programmation et de script Shell 2 06-06-2007 03:44 PM
convertir fichier XML en fichier texte (longueur fixe) ram2s2001 De programmation et de script Shell 0 11-03-2005 01:28 AM
Convertir délimité de longueur fixe nelson553011 De programmation et de script Shell 14 10-27-2005 05:04 PM
comment peut changer udp longueur? Vvlad IP Networking 4 08-14-2003 08:37 AM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
LinkBack Thread Tools Recherche sur ce Thread Rate Thread Modes d'affichage
  #1 (permalink)  
Old 05-29-2007
kumarsaravana_s kumarsaravana_s is offline
Registered User
  
 

Join Date: Feb 2007
Lieu: Bangalore
Messages: 105
Peut-on convertir un '|' dans un fichier de longueur fixe?

Salut tous,

J'ai un tuyau séparé file.But plat, il ya souvent un problème avec le records.So est-il possible de convertir les' | 'fichier séparé dans un fichier de longueur fixe, par le biais de certains scripts.

Le fichier comporte 11 colonnes, qui signifie 10 pipes.Your aide est appréciée.

J'utilise Sun OS Version 5.10

Merci,
Kumar
  #2 (permalink)  
Old 05-29-2007
aigles's Avatar
Aigles aigles is offline Forum Advisor  
Registered User
  
 

Date d'inscription: avril 2004
Lieu: Bordeaux, France
Posts: 1423
Vous pouvez faire quelque chose comme ça:
Code:
awk '
   BEGIN {
      fields_count = split("5,5,5,5,5,5,5,5,5,5,5", fsize, ",");
      FS  = "|"
      OFS = "";
   }
   function cnv_field(fld   ) {
      if (length($fld) > fsize[fld]) {
         printf("Line %d, field %d is too long (%d > %d)\n", NR, fld, length($fld), fsize[fld]) | "cat >&2";
         status = 1;
      }
      $fld = sprintf("%-5.5s", $fld);
   }
   {
      if (NF != fields_count) { 
         printf("Line %d, fields count is invalid (%d != %d)\n", NR, NF, fields_count) | "cat >&2";
         status = 1;
      }
      for (f=1; f<=NF; f++) cnv_field(f);
      print;
   }
   END {
      exit status;
   }
    '  $1 > $2
Le longueur de chaque champ est spécifié dans la fields_count cession. Dans mon code tous les champs sont de 5 caractères.
Dans la sortie, le séparateur de champ est fixé à "" mais vous pouvez le modifier. Par exemple, si vous voulez un espace de modifier l'affectation OFS:
OFS \u003d ""
Exemple (fichier script assumer convert.sh):
Code:
$ cat input_file
111|22|333|444|555||77|888|9999|000|1
aa|bbbbbb|cc|dd|rr|ff|ggggggg|hh|ii|jjj|hhh
xxx|yyy|zzz
$ convert.sh input_file output_file
Line 2, field 2 is too long (6 > 5)
Line 2, field 7 is too long (7 > 5)
Line 3, fields count is invalid (3 != 11)
$ echo $?
1
$ cat output_file
111  22   333  444  555       77   888  9999 000  1    
aa   bbbbbcc   dd   rr   ff   ggggghh   ii   jjj  hhh  
xxx  yyy  zzz  
$
Jean-Pierre.

Dernière édition par les Aigles, au 05.30.2007 05:26 AM.. Motif: ajout infos Abour sortie séparateur de champ
  #3 (permalink)  
Old 05-30-2007
Bakounine bakunin is offline Forum Staff  
Bughunter Extraordinaire
  
 

Join Date: Mai 2005
Situation: A la gauche octet de / dev / kmem
Posts: 1628
Comme les "champs" dans votre fichier sont séparées par un char ("|") utilisation couper de les séparer, puis de l'imprimer via les lignes printf (i Kornshell assumer ici, de l'utilisation 'echo' au lieu de 'print' si vous utilisez autre chose):

Code:
cat infile | while read line ; do
     # split each input line to fields and catch these in variables
     field1="$(print - "$line" | cut -d'|' -f1)"
     field2="$(print - "$line" | cut -d'|' -f2)"
     field3="$(print - "$line" | cut -d'|' -f3)"
     .....
     
     # after you are done with the line print it out again
     # i assume here that the first column should be 20 chars wide, the next
     # two 15, and so on. see the second example below.
     printf '%20s %15s %15s [...]\n' "$field1" "field2" "$field3" [...] >> outfile
done
Ceci est l'aide (un nombre fixe de) fixe la largeur des colonnes et que vous avez à savoir la largeur à l'avance. Il est possible de créer dynamiquement des colonnes en forme, mais vous devrez lire le infile deux fois:


Code:
maxlength1=0
maxlength2=0
....
cat infile | while read line ; do
     # in the first run we split and get the max width for each column
     field1="$(print - "$line" | cut -d'|' -f1)"
     length1=$(print - "$field1" | wc -c)
     if [ $length1 -gt $maxlength1 ] ; then
          maxlength1=$length1
     fi
     field2="$(print - "$line" | cut -d'|' -f2)"
     length2=$(print - "$field2" | wc -c)
     if [ $length2 -gt $maxlength2 ] ; then
          maxlength2=$length1
     fi
     .....
done

# put together the output template for printf
template='%'"$maxlength1"'s   %"'$maxlength2"'s [.....]\n'
   
cat infile | while read line ; do
     # in the second run we split again and print using the found widths
     field1="$(print - "$line" | cut -d'|' -f1)"
     field2="$(print - "$line" | cut -d'|' -f2)"
     ....
     printf "$template" "$field1" "field2" "$field3" [...] >> outfile
done
Je vous suggérons d'utiliser (dynamique) au lieu des tableaux numérotés de variables pour faire le script en mesure de traiter avec un nombre variable de champs dans le fichier d'entrée comme un nouveau renforcement. Le séparateur de colonne peut alors être fournie comme un paramètre de script le plus largement utilisable que possible.

Bakounine
Closed Thread

Bookmarks

Thread Tools Recherche sur ce Thread
Recherche sur ce Thread:

Recherche avancée
Modes d'affichage Rate this thread
Rate this thread:

Règles de messages
Tu mai pas de nouvelles discussions: nonoui
Tu mai pas envoyer des réponses:
Tu mai pas envoyer des pièces jointes
Tu mai pas modifier vos messages

BB code est Sur
Smilies sont Sur
[IMG] code est Sur
Le code HTML est Hors tension
Trackbacks sont Sur
Pingbacks sont Sur
Refbacks sont Sur




Toutes les heures sont au format GMT -4. Le temps est maintenant 05:33 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traductions Langue Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
Les systèmes UNIX et Linux Forums Content Copyright © 1993-2009. Tous droits Reserved.Ad de gestion par RedTyger

Content Relevant URLs par vBSEO 3.2.0