The UNIX and Linux Forums  


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
Parsing de fichier pour le rapport de génération (String d'analyse et de division) umar.shaikh De programmation et de script Shell 8 03-02-2009 01:38 AM
l'analyse de champ de longueur fixe avec yacc / bison sungita High Level Programming 1 01-27-2009 11:27 AM
Lire une chaîne de caractères avec des espaces et de trouver la longueur de la chaîne dayamatrix UNIX pour les nuls Questions et réponses 2 11-13-2008 10:08 AM
Parsing un record de longueur variable Barb UNIX pour les nuls Questions et réponses 17 10-01-2004 09:37 AM
Analyse des données et de conserver toute la longueur de la variable app4dxh De programmation et de script Shell 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 Recherche sur ce Thread Rate Thread Modes d'affichage
  #1 (permalink)  
Old 04-21-2009
ppat7046 ppat7046 is offline
Registered User
  
 

Date d'inscription: juillet 2007
Posts: 24
Parsing 286 longueur de chaîne de caractères

Salut amis,

Je l'ai. Txt qui a 13000 dossiers.
Chaque enregistrement est 278 caractères de long.

J'utilise le code ci-dessous pour en extraire la chaîne et il faut près de 10 minutes.
Toute suggestion s'il vous plaît.

cat nom_fichier.txt | tout lire en ligne
faire

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

Join Date: Feb 2005
Lieu: Boston, MA
Posts: 5,130
nawk-f fieldwidth.awk nom_fichier.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
Registered User
  
 

Join Date: Nov 2006
Lieu: Royaume-Uni
Messages: 178
Un simple méthode est de créer de 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";
}

Ensuite, exécutez


Code:
awk -f parse.awk filename.txt > FinalResult.txt

Je pense que votre code d'origine est de prendre le temps que chaque backtick, echo et awk est un nouveau processus de frai
  #4 (permalink)  
Old 04-22-2009
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programmeur, auteur
  
 

Join Date: Mar 2007
Lieu: Toronto, Canada
Messages: 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
Registered User
  
 

Date d'inscription: avril 2009
Messages: 1
Salut ppl ..

Que faire si j'ai de la ligne comme ce
A BCD

ce qui indique que le premier champ est f1 \u003d A, f2 \u003d f3 \u003d BCD
c'est-à-dire second champ vide de 6 caractères. Alors maintenant, si je utiliser le script ci-dessus, je ne suis pas en mesure d'obtenir les champs dans cette affaire.
Pouvez-vous s'il vous plaît penser, dans ce cas, comment faire?

Cheers Amit
  #6 (permalink)  
Old 04-22-2009
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell programmeur, auteur
  
 

Join Date: Mar 2007
Lieu: Toronto, Canada
Messages: 2361

Utiliser $ 0 au lieu de $ 1 (qui est ce que je devrais avoir utilisé):


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
Registered User
  
 

Date d'inscription: juillet 2007
Posts: 24
Merci à vous tous pour votre réponse.

J'ai utilisé suggestion fournies par cfajohnson et maintenant il ne faut que 20 secconds pour analyser les 800.000 dossiers.

Merci beaucoup,
Prashant
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 08:54 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