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
Analizar el Informe de archivo de la Generación (String analizar y división) umar.shaikh Programación de scripts de shell y 8 03-02-2009 01:38 AM
analizar el campo de longitud fija con Yacc / bisonte sungita Programación de Alto Nivel 1 01-27-2009 11:27 AM
Leer una cadena con espacios y encontrar la longitud de la cadena dayamatrix UNIX for Dummies Preguntas y Respuestas 2 11-13-2008 10:08 AM
Parsing un registro de longitud variable Barb UNIX for Dummies Preguntas y Respuestas 17 10-01-2004 09:37 AM
Analizar los datos y mantener toda la longitud de la variable app4dxh Programación de scripts de shell y 3 11-22-2002 12:04 PM

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 04-21-2009
ppat7046 ppat7046 is offline
Usuario Registrado
  
 

Fecha: julio 2007
Puestos: 24
Parsing 286 caracteres de longitud de cadena

Hola Amigos,

Que tengo. Txt que tiene 13.000 registros.
Cada registro es de 278 caracteres de largo.

Estoy utilizando a continuación el código para extraer la cadena y lleva casi 10 minutos.
Cualquier sugerencia por favor.

cat filename.txt | while read línea
hacer

f1 \u003d `echo $ line | awk '(print substr ($ 1,1,9))'`
f2 \u003d `echo $ line | awk '(print substr ($ 1,10,20))'`
f3 \u003d `echo $ line | awk '(print substr ($ 1,30,50))'`
f4 \u003d `echo $ line | awk '(print substr ($ 1,80,10))'`
f5 \u003d `echo $ line | awk '(print substr ($ 1,90,50))'`
f6 \u003d `echo $ line | awk '(print substr ($ 1,140,10))'`
f7 \u003d `echo $ line | awk '(print substr ($ 1,150,50))'`
f8 \u003d `echo $ line | awk '(print substr ($ 1,200,10))'`
f9 \u003d `echo $ line | awk '(print substr ($ 1,210,50))'`
F10 \u003d `echo $ line | awk '(print substr ($ 1,260,10))'`
f11 \u003d `echo $ line | awk '(print substr ($ 1,270,8))'`
f12 \u003d `echo $ line | awk '(print substr ($ 1,278,8))'`

s1 \u003d `echo $ f1" | "$ f2" | "$ f3" | "$ f4" | "$ f5" | "`
s2 \u003d `echo $ f6" | "$ f7" | "$ f8" | "`
s3 \u003d `echo $ f9" | "$ F10" | "`
s4 \u003d `echo $ f11" | "$ f12»

echo $ s1 $ s2 $ s3 $ s4>> FinalResult.txt
hecho
  #2 (Enlace permanente)  
Old 04-21-2009
vgersh99's Avatar
vgersh99 vgersh99 is offline Forum Staff  
Moderador
  
 

Fecha: febrero 2005
Localización: Boston, MA
Mensajes: 5.131
nawk-f fieldwidth.awk filename.txt> FinalResul.txt

fieldwidth.awk:

Código:
function setFieldsByWidth(   i,n,FWS,start,copyd0) {
  # Licensed under GPL Peter S Tillier, 2003
  # NB corrupts $0
  copyd0 = $0                             # make copy of $0 to work on
  if (length(FIELDWIDTHS) == 0) {
    print "You need to set the width of the fields that you require" > "/dev/stderr"
    print "in the variable FIELDWIDTHS (NB: Upper case!)" > "/dev/stderr"
    exit(1)
  }

  if (!match(FIELDWIDTHS,/^[0-9 ]+$/)) {
    print "The variable FIELDWIDTHS must contain digits, separated" > "/dev/stderr"
    print "by spaces." > "/dev/stderr"
    exit(1)
  }

  n = split(FIELDWIDTHS,FWS)

  if (n == 1) {
    print "Warning: FIELDWIDTHS contains only one field width." > "/dev/stderr"
    print "Attempting to continue." > "/dev/stderr"
  }

  start = 1
  for (i=1; i <= n; i++) {
    $i = substr(copyd0,start,FWS[i])
    start = start + FWS[i]
  }
}

#Note that the "/dev/stderr" entries in some lines have wrapped.

#I then call setFieldsByWidth() in my main awk code as follows:
BEGIN {
  #FIELDWIDTHS="7 6 5 4 3 2 1" # for example
  # adjust the FIELDWIDTHS values as you see fit.
  FIELDWIDTHS="9 21 51 11 51 11 51 11 51 11 9 9" # for example
  OFS="|"
}
!/^[  ]*$/ {
  saveDollarZero = $0 # if you want it later
  setFieldsByWidth()
  # now we can manipulate $0, NF and $1 .. $NF as we wish
  # print $0 OFS
  print $1,$2,$3,$4,$5,$6,$7,$9,$10,$11,$12
  next
}

  #3 (Enlace permanente)  
Old 04-21-2009
JerryHone JerryHone is offline
Usuario Registrado
  
 

Fecha: noviembre 2006
Ubicación: Reino Unido
Puestos: 178
Un simple método es la creación de script parse.awk


Código:
{
f1=substr($1,1,9);
f2=substr($1,10,20);
f3=substr($1,30,50);
f4=substr($1,80,10);
f5=substr($1,90,50);
f6=substr($1,140,10);
f7=substr($1,150,50);
f8=substr($1,200,10);
f9=substr($1,210,50);
f10=substr($1,260,10);
f11=substr($1,270,8);
f12=substr($1,278,8);

OFS="|";
print f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12;
print "\n";
}

A continuación, ejecute


Código:
awk -f parse.awk filename.txt > FinalResult.txt

Creo que su código original está tomando mucho tiempo, ya que cada backtick, eco y awk es un nuevo proceso de desove
  #4 (Enlace permanente)  
Old 04-22-2009
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programador, autor
  
 

Fecha: marzo 2007
Ubicación: Toronto, Canadá
Puestos: 2.373

Código:
awk '{
 print  substr($1,1,9) "|" \
        substr($1,10,20) "|" \
        substr($1,30,50) "|" \
        substr($1,80,10) "|" \
        substr($1,90,50) "|" \
        substr($1,140,10) "|" \
        substr($1,150,50) "|" \
        substr($1,200,10) "|" \
        substr($1,210,50) "|" \
        substr($1,260,10) "|" \
        substr($1,270,8) "|" \
        substr($1,278,8)
}' filename.txt > FinalResult.txt

  #5 (Enlace permanente)  
Old 04-22-2009
amitmathapati amitmathapati is offline
Usuario Registrado
  
 

Fecha: abril 2009
Publicaciones: 1
PPL Hola ..

lo que si tengo la línea como esta
A BCD

lo que indica que el primer campo es f1 \u003d A, f2 \u003d f3 \u003d BCD
es decir, segundo campo de 6 caracteres en blanco. Así que ahora si uso el script de arriba, no soy capaz de obtener los campos en este caso.
¿Puede sugerir, por favor, en ese caso cómo hacerlo?

Cheers Amit
  #6 (Enlace permanente)  
Old 04-22-2009
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programador, autor
  
 

Fecha: marzo 2007
Ubicación: Toronto, Canadá
Puestos: 2.373

Usar $ 0 en lugar de $ 1 (que es lo que debería haber utilizado):


Código:
awk '{
 print  substr($0,1,9) "|" \
        substr($0,10,20) "|" \
        substr($0,30,50) "|" \
        substr($0,80,10) "|" \
        substr($0,90,50) "|" \
        substr($0,140,10) "|" \
        substr($0,150,50) "|" \
        substr($0,200,10) "|" \
        substr($0,210,50) "|" \
        substr($0,260,10) "|" \
        substr($0,270,8) "|" \
        substr($0,278,8)
}' filename.txt > FinalResult.txt

  #7 (Enlace permanente)  
Old 04-22-2009
ppat7046 ppat7046 is offline
Usuario Registrado
  
 

Fecha: julio 2007
Puestos: 24
Gracias a todos por su respuesta.

Solía sugerencia proporcionada por cfajohnson y ahora tiene sólo 20 secconds para analizar los 800.000 registros.

Muchas gracias,
Prashant
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 09:20 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