![]() |
|
|
google unix.com
|
|||||||
| Forums | Registrer | Forum Regler | Links | Albums | FAQ | Members List | Kalender | Søgning | Dagens Stillinger | Mark Forums Read |
| 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 |
| Append Sidehoved og Trailer | balzzz | UNIX for dummyer Spørgsmål & svar | 2 | 01-06-2008 08:19 AM |
| Kontrol af header og trailer for en given snor, og hvis ikke fundet, exit ud af | er_ashu | UNIX for dummyer Spørgsmål & svar | 2 | 11-08-2007 09:55 AM |
| Kopier alle filerne med tiden stempel og fjerne overskriften, trailer fra fil | ksrams | UNIX for dummyer Spørgsmål & svar | 35 | 07-30-2007 03:15 PM |
| Count nr. Records i File uden optælling Sidehoved og Trailer Records | guiguy | Shell Programmering og Scripting | 2 | 06-07-2007 01:15 PM |
| at kombinere to input tekstfiler | d3ck_tm | AIX | 6 | 02-28-2006 11:23 PM |
![]() |
|
|
LinkBack | Thread Tools | Søg denne tråd | Rate Thread | Display Modes |
|
|
|
||||
|
Merge tekstfiler mens kombinere flere header / trailer records i en hver.
Situation:
Vores system i øjeblikket udfører et job (COBOL Program), der genererer en grænseflade fil, der skal sendes til en af vores leverandører. Fordi dette system behandler oplysningerne i over 100.000 ansatte / pensionister (og voksende), vil vi gerne multi-tråd jobbet i behandlingen-grupper med henblik på at reducere sine løbe-tid. Dette virker fint, men vi er konfronteret med flere interface filer, der skal slås sammen, før overførsel til sælgeren. Nogle Oplysninger om den sag: Den genererede fil har en header og en trailer rekord, og traileren rekord er relevante samlede værdier (dvs. ansatte tælle, optegnelser godkendt, etc). Der er ingen feltseparatorer - disse er fast længde felter. Knibe i detaljer: Vi vil gerne til at sammenkæde de filer - det er den nemme del. Hvad gør det svært er, at vi er nødt til at fjerne de mange header optegnelser og bevarer kun den første. Også, vi har brug for at fjerne de mange traileren optegnelser, men vi er nødt til at tilføje alle de værdi totaler fra hver trailer ind i en trailer registrerer vi bevarer i slutningen. Som du måske har anet, som nu, har jeg skrevet nogle UNIX-scripts, men mangler nogle vigtige viden i tilknytning til de enkelte registrere og på manipulation i en tekstfil. I særdeleshed vil jeg gerne vide, hvordan jeg kan definere specifikke felter, når jeg læser hver post - det er disse felter til traileren optegnelser jeg nødt til at holde et rullende alt om. Også, vil jeg gerne vide, hvordan jeg kan slette enkelte poster. Enhver hjælp vil blive meget værdsat. |
|
||||
|
Prøvefilen
Citat:
BATCH CER PRO 0724200808042008 01E000036841 LEAD05151948F 51498 10012007 YYY 02E000036841 ME 04161988F 10.012.007 01E000060640 MDGV12251951F 51.498 1001200709302008YYY 02E000060640 RD 05061941M 1001200709302008 01E000025850 LDUO06081956F 51.498 1001200709302008YYY 02E000025850 ED 10071937M 1001200709302008 01E029009859 DUA05021960F 51498 10012007 YYY 02E029009859 LD 03101989F 10.012.007 02E029009859 LD 02041997M 10.012.007 01E034008379 AEUA09181965F 51498 10012007 YYY 02E034008379 NE 11131991F 10.012.007 02E034008379 RE 01131993F 10.012.007 02E034008379 EE 09191959M 10.012.007 01E045005523 EUA02131964M 51498 10012007 ÝÑñ 01E046004280 DUA12041947M 51498 10012007 YYY 02E046004280 D 12121953F 10.012.007 02E046004280 KE 09211986M 10.012.007 01E048005119 BDUA01301961F 51498 10012007 ÝÑñ 01E055002147 LDUA10011964F 51498 10012007 YYY 02E055002147 RD 11121966M 10.012.007 02E055002147 ND 02131997F 10.012.007 02E055002147 JD 03111992M 10.012.007 01E057008796 SEUA12061975F 51498 10012007 YYY BATCH TRAILER 000001150000019908042008 Nærmere oplysninger om de Trailer Record: Det 00000115 er en samlet værdi (antal ansatte), at 00.000.199 er summen af registre behandles (ansatte og pårørende). Disse to områder, som jeg havde behov for at holde en rullende samlet for alle de filer, vi fusionere. De detaljerede optegnelser er over 300 tegn lang (uden betydning for, hvad vi skal gøre, men tænkte jeg tage det). Tak! |
|
||||
|
påtage sig denne: 01E000036841 er en medarbejder-id og filer navngives <something>. dat Code:
ls *.dat | read header dummy
# save copies of header
head -1 $header > tmp
awk '{ if (index($0, "HEADER") > 0 || index($0, "TRAILER") >0 ) {last= $0; continue}
arr[$0]++; print $0 }
END { for (i in arr)
{
empcnt++
lc+=arr[i]
}
print empcnt, lc > "cntfile" } ' *.dat >> tmp
awk ' { rec=sprintf("%08d%08d", $1 $2)}
END { printf("BATCH TRAILER %s%s\n", rec, substr(last, length(last)-7) } ' cntfile >> tmp
mv tmp employee.dat
Dette forudsætter også de sidste otte tegn i BATCHNUMMER TRAILER er alle samme. |
|
||||
|
hi nedenfor perl kan hjælpe dig lidt Usage: perl a.pl NUM fil1 fil2 [her NUM angive, hvor mange linjer vil blive header] Code:
a: ***** line 1 line 2 1 2 3 4 5 Code:
b: ***** line 3 line 4 9 8 7 6 5 output: Code:
***** line 1 line 2 line 3 line 4 10 10 10 10 10 Code:
$header=shift;
undef $/;
my(@head,@body,@foot);
while($file=shift){
open FH,"<$file" or die "Can not open file $_";
my $str=<FH>;
close FH;
my @temp=split("\n",$str);
for( my $i=0;$i<$header;$i++){
push @head,$temp[$i] if ($#head<$header-1);
}
for(my $j=$header;$j<$#temp;$j++){
push @body,$temp[$j];
}
my @footer = split(" ",$temp[$#temp]);
for($k=0;$k<=$#footer;$k++){
$foot[$k]=$foot[$k]+$footer[$k];
}
}
print join "\n",@head;
print "\n",join "\n",@body;
print "\n",join " ",@foot;
|
![]() |
| Bogmærker |
| Tags |
| perl, perl skift, skift, skift perl |
| Thread Tools | Søg denne tråd |
| Display Modes | Bedøm denne tråd |
|
|