The UNIX and Linux Forums  
Hej och välkommen från USA till UNIX och Linux Forum! Tack för ditt besök och gå med i vår globala gemenskapen.

Go Back   UNIX och Linux Forum > Upp Forum > Shell-programmering och Skript
.
google unix.com



Shell-programmering och Skript Post frågor om ksh, CSH, SH, bash, PERL, PHP, sed, awk och andra skalskript och skal skriptspråk här.

Mer UNIX och Linux Forum Ämnen Du kan hitta Helpful
Tråd Thread Starter Forum Svar Senaste Inlägg
Parsning av ärende för rapporten Generation (String parsning och delning) umar.shaikh Shell-programmering och Skript 8 03-02-2009 01:38
parsning fast längd område med yacc / bison sungita High Level Programming 1 01-27-2009 11:27
Läs en sträng med ledande utrymmen och hitta den längd av strängen dayamatrix UNIX for Dummies Frågor & Svar 2 11-13-2008 10:08
Analysera en variabel längd titelinformation Barb UNIX for Dummies Frågor & Svar 17 10-01-2004 08:37
Analysera data och behålla de fulla längd av variabel app4dxh Shell-programmering och Skript 3 11-22-2002 12:04

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ök i denna tråd Rate Thread Visningslägen
  #1 (permalänk)  
Old 04-21-2009
ppat7046 ppat7046 is offline
Registered User
  
 

Join Date: Jul 2007
Inlägg: 24
Analysera 286 längd Teckensträng

Hej Vänner,

Jag har. Txt-fil som har 13000 poster.
Varje post är 278 tecken lång.

Jag använder följande kod för att hämta strängen och det tar nästan 10 minuter.
Alla förslag tack.

katt filename.txt | samtidigt läsa linje
göra

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

Join Date: februari 2005
Ort: Boston, MA
Inlägg: 5.121
nawk-f fieldwidth.awk filename.txt> FinalResul.txt

fieldwidth.awk:
Kod:
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 (permalänk)  
Old 04-21-2009
JerryHone JerryHone is offline
Registered User
  
 

Join Date: Nov 2006
Ort: UK
Inlägg: 178
Ett enklare metod är att skapa skript parse.awk

Kod:
{
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";
}
Kör sedan

Kod:
awk -f parse.awk filename.txt > FinalResult.txt
Jag tror att din ursprungliga kod tar lång tid eftersom varje backtick, eko och awk är lekande en ny process
  #4 (permalänk)  
Old 04-21-2009
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programmerare, författare
  
 

Join Date: mars 2007
Ort: Toronto, Kanada
Inlägg: 2361
Kod:
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 (permalänk)  
Old 04-22-2009
amitmathapati amitmathapati is offline
Registered User
  
 

Join Date: april 2009
Inlägg: 1
Hej ppl ..

tänk om jag har den rad som denna
A BCD

som visar att första området är f1 \u003d A, f2 \u003d f3 \u003d BCD
dvs andra området har 6 tomma tecken. Så nu om jag använder ovanstående script jag inte kunnat få de områden som i så fall.
Kan du föreslå i så fall hur den ska?

Skål Amit
  #6 (permalänk)  
Old 04-22-2009
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programmerare, författare
  
 

Join Date: mars 2007
Ort: Toronto, Kanada
Inlägg: 2361

Använd $ 0 i stället för $ 1 (vilket är vad jag borde ha använt):

Kod:
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 (permalänk)  
Old 04-22-2009
ppat7046 ppat7046 is offline
Registered User
  
 

Join Date: Jul 2007
Inlägg: 24
Tack alla för era svar.

Jag brukade förslag som cfajohnson och nu tar det bara 20 secconds att analysera 800.000 poster.

Tack så mycket,
Prashant
Closed Thread

Komihåglista

Thread Tools Sök i denna tråd
Sök i denna tråd:

Avancerad sökning
Visningslägen Betygsätt denna tråd
Betygsätt denna tråd:

Utstationering Regler
Du får inte efter nya trådar
Du får inte efter svar
Du får inte skicka bilagor
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG] kod
HTML-koden är Av
Trackback är
Pingbacks är
Refbacks är




Alla tider är GMT -4. Klockan är nu 02:08.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Översättningar Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX och Linux Forum Innehållet upphovsrättsskyddat © 1993-2009. All Rights Reserved.Ad förvaltning RedTyger

Content Relevant webbadresser från vBSEO 3.2.0