The UNIX and Linux Forums  

Go Back   El UNIX y Linux Foros > Arriba Foros > Programación de scripts de shell y
.
google unix.com



Programación de scripts de shell y Plantear preguntas sobre KSH, CSH, SH, BASH, PERL, PHP, SED, AWK y otros scripts de shell y lenguajes de script de shell aquí.

Más UNIX y Linux Foro Temas usted puede encontrar útiles
Hilo Hilo para principiantes Foro Respuestas Último mensaje
cómo convertir archivos de longitud fija de archivo delimitado. satyam_sat Programación de scripts de shell y 7 04-03-2008 03:41 AM
Conversión de un archivo delimitado de ancho fijo a archivo raghavan.aero Programación de scripts de shell y 2 06-06-2007 03:44 PM
convertir el archivo XML en el archivo de texto (de longitud fija) ram2s2001 Programación de scripts de shell y 0 11-03-2005 01:28 AM
Delimitado para convertir longitud fija nelson553011 Programación de scripts de shell y 14 10-27-2005 05:04 PM
cómo puede cambiar la longitud udp? Vvlad Redes IP 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 vínculo Herramientas de hilo Buscar en este Hilo Tasa de Hilo Modos de visualización
  #1 (Enlace permanente)  
Old 05-29-2007
kumarsaravana_s kumarsaravana_s is offline
Usuario Registrado
  
 

Fecha: febrero 2007
Ubicación: Bangalore
Puestos: 105
¿Se puede convertir un '|' en un archivo de longitud fija?

Hi All,

Tengo una tubería separados file.But plana a menudo hay un problema con el records.So es posible convertir el '|' separados en un archivo de longitud fija de archivos por medio de una secuencia de comandos.

El archivo tiene 11 columnas, lo que significa 10 pipes.Your ayuda es apreciada.

Estoy utilizando Sun OS Versión 5.10

Gracias,
Kumar
  #2 (Enlace permanente)  
Old 05-29-2007
aigles's Avatar
Aigles aigles is offline Forum Advisor  
Usuario Registrado
  
 

Fecha: abril 2004
Ubicación: Burdeos, Francia
Mensajes: 1.433
Usted puede hacer algo como lo siguiente:

Código:
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

El longitud de cada campo se especifica en la asignación fields_count. En mi código de todos los campos son de 5 caracteres.
En la salida, el separador de campo está ajustado a "" pero puede modificarlo. Por ejemplo, si desea un espacio modificar la asignación OFS:
OFS \u003d ""
Ejemplo (archivo de comandos asumir convert.sh es):

Código:
$ 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.

Última edición por Aigles; al 05-30-2007 05:26 AM.. Motivo: añadir información de salida SOBRE separador de campo
  #3 (Enlace permanente)  
Old 05-30-2007
Bakunin bakunin is offline Forum Staff  
Bughunter Extraordinaire
  
 

Fecha: mayo de 2005
Ubicación: En el extremo izquierdo de bytes de / dev / kmem
Puestos: 1.641
Como "campos" en el archivo están separados por un carácter constante ("|") uso cortar para separarlas, a continuación, a través de las líneas de impresión printf (i Kornshell asumir aquí, el uso "eco" en lugar de "imprimir" si usted está utilizando otra cosa):


Código:
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

Se trata de utilizar (un número fijo de) las columnas de ancho fijo y tienes que saber el ancho de antelación. Es posible crear dinámicamente columnas con formato, pero usted tendrá que leer el infile dos veces:



Código:
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

Me sugieren que el uso (dinámica) en lugar de conjuntos de variables numeradas para que el script para poder hacer frente a un número variable de campos en el archivo de entrada como un nuevo refuerzo. La columna de separación podrían ser proporcionados como un parámetro de la secuencia de comandos de lo más ampliamente utilizables como sea posible.

Bakunin
Closed Thread

Marcadores

Herramientas de hilo Buscar en este Hilo
Buscar en este Hilo:

Búsqueda avanzada
Modos de visualización Vota a este hilo
Vota a este hilo:

Normas de envío
puede que no nuevo puesto de hilos
puede que no enviar respuestas
puede que no enviar archivos adjuntos
puede que no editar sus puestos

Código BB es Encendido
Emoticones son Encendido
[IMG] código Encendido
Código HTML es Apagado
Trackbacks son Encendido
Pingbacks son Encendido
Refbacks son Encendido




Todas las horas son GMT -4. La hora es 04:11 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traducciones de idiomas Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Estudios
El UNIX y Linux Foros Contenido Copyright © 1993-2009. Todos los derechos Reserved.Ad Gestión por RedTyger

Las direcciones URL de contenido vBSEO 3.2.0