The UNIX and Linux Forums  
Hei og Velkommen fra USA til UNIX og Linux Forums! Takk for besøket og Delta i vårt globale samfunn.

Go Back   UNIX og Linux Forums > Top Forums > Shell programmering og Skripting
.
google unix.com



Shell programmering og Skripting Post spørsmål om ksh, csh, SH, Bash, Perl, PHP, SED, awk og ANDRE shell scripts og Shell skriptespråk her.

Mer UNIX og Linux Forum Emner Du kan finne nyttig
Tråd Tråd startet Forum Svar Siste innlegg
hvordan du konverterer Fast lengde filen til avgrenset fil. satyam_sat Shell programmering og Skripting 7 04-03-2008 02:41
Konvertere en avgrenset fil til fast bredde fil raghavan.aero Shell programmering og Skripting 2 06-06-2007 02:44
konvertere XML fil inn Tekstfil (fast lengde) ram2s2001 Shell programmering og Skripting 0 11-03-2005 01:28
Konverter avgrenset til fast lengde nelson553011 Shell programmering og Skripting 14 10-27-2005 04:04
hvordan kan endre UDP lengde? Vvlad IP Networking 4 08-14-2003 07:37

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 denne tråden Rate Thread Visningsmoduser
  #1 (permalink)  
Old 05-29-2007
kumarsaravana_s kumarsaravana_s is offline
Registrert bruker
  
 

Bli Date: Feb 2007
Beliggenhet: Bangalore
Innlegg: 105
Kan vi konvertere en "|"-filen til en fast lengde??

Hei Alle,

Jeg har en pipe skilt flat file.But det ofte er noe problem med records.So er det mulig å konvertere '|' delt fil til en fast lengde fil ved hjelp av et skript.

Filen har 11 kolonner som betyr 10 pipes.Your hjelpe er verdsatt.

Jeg bruker Sun OS Version 5.10

Takk,
Kumar
  #2 (permalink)  
Old 05-29-2007
aigles's Avatar
aigles aigles is online now Forum Advisor  
Registrert bruker
  
 

Bli Dato: april 2004
Sted: Bordeaux, Frankrike
Innlegg: 1418
Du kan gjøre noe sånt:
Code:
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
Den, det Lengden på hvert felt er angitt i fields_count oppdraget. I koden meg alle feltene er 5 tegn.
I produksjon, det Feltet separator er satt til "" men du kan endre det. For eksempel hvis du ønsker en plass endre OFS oppdraget:
OFS \u003d ""
Eksempel (anta skriptfil er convert.sh):
Code:
$ 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.

Sist endret av aigles; 05-30-2007 på 04:26.. Reason: legge Infos abour utdatafelt separator
  #3 (permalink)  
Old 05-30-2007
Bakunin bakunin is offline Forum Staff  
Bughunter Extraordinaire
  
 

Bli Dato: mai 2005
Beliggenhet: I venstre byte av / dev / kmem
Innlegg: 1628
Som "felt" i filen er atskilt med en konstant røye ("|") bruk kutte å skille dem, deretter skrive ut linjene via printf (jeg antar Kornshell her, bruk "ekko" i stedet for "print" hvis du bruker noe annet):

Code:
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
Dette er med (et fast antall) fast bredde kolonner og du må kjenne bredder på forhånd. Det er mulig å lage dynamisk formaterte kolonner, men du må lese infile to ganger:


Code:
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
Jeg vil foreslå at du bruker (dynamiske) matriser istedenfor de nummererte variabler å gjøre manuset stand til å håndtere et varierende antall felt i inndatafilen som en ytterligere forbedring. Kolonnen separator kan deretter gis som en parameter lage scriptet så vidt anvendelig som mulig.

Bakunin
Closed Thread

Hugseliste

Thread Tools Søk i denne tråden
Søk i denne tråden:

Avansert søk
Visningsmoduser Ranger denne tråden
Ranger denne tråden:

Innleggsaktivitet Regler
Du kanskje ikke poste nye tråder
Du kanskje ikke poste svar
Du kanskje ikke post vedlegg
Du kanskje ikke redigere innleggene dine

BB-kode er
Smilefjes er
[IMG] koden
HTML-koden Av
Pingbacks er
Refbacks er




Alle klokkeslett er GMT -4. Nå er klokken 12:12.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Language Translations Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX og Linux Forums Content Copyright © 1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant nettadresser av vBSEO 3.2.0