The UNIX and Linux Forums  
Hej og Velkommen fra USA til UNIX og Linux Forums! Tak for dit besøg og deltager i vores globale samfund.

Go Back   UNIX og Linux Forums > Top Forums > Shell Programmering og Scripting
.
google unix.com



Shell Programmering og Scripting Post spørgsmål om ksh, CSH, SH, Bash, Perl, PHP, SED, AWK og ANDRE shell scripts og Shell scriptsprog her.

Mere UNIX og Linux Forum Emner du måske kan finde Helpful
Tråd Thread Starter Forum Svar Last Post
Analysering af fil til rapporten Generation (String parsing og opsplitning) umar.shaikh Shell Programmering og Scripting 8 03-02-2009 01:38 AM
parsing fast længde område med yacc / bison sungita Højtstående Programmering 1 01-27-2009 11:27 AM
Læs en string med ledende rum og finde længden af strengen dayamatrix UNIX for dummyer Spørgsmål & svar 2 11-13-2008 10:08 AM
Parse en variabel længde record Barb UNIX for dummyer Spørgsmål & svar 17 10-01-2004 08:37 AM
Parse data og beholde den fulde længde af variable app4dxh Shell Programmering og Scripting 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 Thread Tools Søg denne tråd Rate Thread Display Modes
  #1 (permalink)  
Old 04-21-2009
ppat7046 ppat7046 is offline
Registreret Bruger
  
 

Join Date: Jul 2007
Stillinger: 24
Analysering 286 længde Tegnstreng

Hej Venner,

Jeg har. Txt-fil, der har 13.000 registreringer.
Hver record er 278 tegn lang.

Jeg bruger følgende kode til at udtrække strengen og det tager næsten 10 minutter.
Ethvert forslag, tak.

cat filename.txt | mens læse linje
gøre

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
gjort
  #2 (permalink)  
Old 04-21-2009
vgersh99's Avatar
vgersh99 vgersh99 is online now Forum Staff  
Moderator
  
 

Join Date: Feb 2005
Beliggenhed: Boston, MA
Indlæg: 5.121
nawk-f fieldwidth.awk filename.txt> FinalResul.txt

fieldwidth.awk:
Code:
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 (permalink)  
Old 04-21-2009
JerryHone JerryHone is offline
Registreret Bruger
  
 

Join Date: Nov 2006
Beliggenhed: UK
Stillinger: 178
En enklere Metoden er at skabe script parse.awk

Code:
{
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";
}
Derefter køre

Code:
awk -f parse.awk filename.txt > FinalResult.txt
Jeg tror, at din oprindelige kode er tager lang tid, som hvert backtick, ekko og awk er gydende en ny proces
  #4 (permalink)  
Old 04-21-2009
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programmør, forfatter
  
 

Join Date: Mar 2007
Beliggenhed: Toronto, Canada
Stillinger: 2361
Code:
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 (permalink)  
Old 04-22-2009
amitmathapati amitmathapati is offline
Registreret Bruger
  
 

Join Date: Apr 2009
Stillinger: 1
Hi ppl ..

hvad nu hvis jeg har den linje som denne
En BCD

hvilket tyder på, at første felt er f1 \u003d A, f2 \u003d f3 \u003d BCD
dvs andet felt har 6 blanke tegn. Så nu hvis jeg bruger ovenstående script, jeg er ikke i stand til at få de områder i den pågældende sag.
Kan du venligst foreslår i så fald, hvordan man griber det an?

Cheers Amit
  #6 (permalink)  
Old 04-22-2009
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programmør, forfatter
  
 

Join Date: Mar 2007
Beliggenhed: Toronto, Canada
Stillinger: 2361

Brug $ 0 i stedet for $ 1 (hvilket jeg burde have anvendt):

Code:
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 (permalink)  
Old 04-22-2009
ppat7046 ppat7046 is offline
Registreret Bruger
  
 

Join Date: Jul 2007
Stillinger: 24
Tak til alle for Deres svar.

Jeg brugte forslag fra cfajohnson og nu tager det kun 20 secconds at parse 800.000 registreringer.

Mange tak,
Prashant
Closed Thread

Bogmærker

Thread Tools Søg denne tråd
Søg denne tråd:

Avanceret søgning
Display Modes Bedøm denne tråd
Bedøm denne tråd:

Udstationering Regler
Du kan ikke post nye tråde
Du kan ikke post svar
Du kan ikke post vedhæftede filer
Du kan ikke redigere dine indlæg

BB-kode er
Smilies er
[IMG] koden er
HTML-koden er Slukket
Trackbacks er
Pingbacks er
Refbacks er




Alle tidspunkter er GMT -4. Den tid er nu 01:16 PM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Oversættelser Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX og Linux Forums Content Copyright © 1993-2009. Alle rettigheder Reserved.Ad Management ved RedTyger

Content Relevant webadresser ved vBSEO 3.2.0