![]() |
|
|
google unix.com
|
|||||||
| Forum | Registrera | Forum Regler | Länkar | Album | FAQ | Medlemslista | Kalender | Söka | Dagens inlägg | Markera forum som lästa |
| 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 |
| Sed Hjälp i Uppdatering något bara i en viss fil. | bisla.yogender | Shell-programmering och Skript | 4 | 03-24-2008 11:48 |
| Att veta om filen är en uppdatering eller inte | raj333 | Shell-programmering och Skript | 2 | 11-05-2007 05:29 |
| Uppdatera fil i loop | braindrain | Shell-programmering och Skript | 4 | 06-20-2007 02:37 |
| Varför min sar inte uppdatera utdatafilen. | skneeli | UNIX för avancerade & Expertanvändare | 1 | 11-12-2006 08:29 |
| Uppdatera en fil i ett zip-arkiv | dbridle | AIX | 6 | 09-27-2006 04:29 |
![]() |
|
|
LinkBack | Thread Tools | Sök i denna tråd | Rate Thread | Visningslägen |
|
|
|
||||
|
awk uppdatera en fil med en annan, att jämföra, uppdatering
Hej,
Jag läser och söka igenom denna underbara forum och provat olika metoder men det verkar jag saknar vissa kunskaper och neuron ^ ^ Här är vad jag strävar efter: fil1: test Filstorlek 3.495; test fileb 4.578; test filec 7.689; test Filey 9.978; test filez 12.300; fil2: test Filstorlek 3.495; test in 4.578; test filec 7.689; test filX 8.978; resultat: test Filstorlek 3.495; test in 4.578; test filec 7.689; test filX 8.978; test Filey 9.978; test filez 12.300; jämförelse baseras på sista fältet (fält 3 $), nytt innehåll från fil2 (här innehållet med "nyckel" 8.978 är ny) bör läggas till den slutliga produktionen och innehåll som är annorlunda i fil2 (test in 4578, här), skall ersätta file1 en . Här är där jag är nu: awk 'NF (key \u003d $ NF; nycklar [key] + +) NR \u003d\u003d Bildrutnr (Nyckel1 [key] \u003d $ NF ORS; rec1 [key] \u003d $ 0 ORS; nästa) (key2 [key] \u003d $ NF ORS; rec2 [key] \u003d $ 0 ORS; nästa) END (for (k i nycklar) (if (Nyckel1 [k] \u003d\u003d key2 [k]) (print rec2 [k]) else (print rec1 [k]))) ' $ fil1 $ fil2> $ file1.updated för läsbarhet: awk ' NF ( key \u003d $ NF; keys [key] + + ) NR \u003d\u003d FNR ( Nyckel1 [key] \u003d $ NF ORS; rec1 [key] \u003d $ 0 ORS; nästa ) ( key2 [key] \u003d $ NF ORS; rec2 [key] \u003d $ 0 ORS; nästa ) Slut ( för (k in nycklar) ( if (Nyckel1 [k] \u003d\u003d key2 [k]) ( print rec2 [k] ) annan ( print rec1 [k] ) ) ) ' $ fil1 $ fil2> $ file1.updated men .. Det fungerar inte bra: / |
|
||||
|
oh my ....
![]() Tack så mycket! Jag trodde att lösningen var något som lagrar nycklar från fil1, upprepa dem på fil2, sedan vända iteration att hitta försvunna records ... Jag var långt långt borta från skönhet awk ... Om jag förstått saken rätt, läser awk de två filerna och automagiskt sammanslagna poster själv? Det betyder att det inte finns något behov av att lagra värden från fil1 att jämföra dem med fil2? Beautifull ... Två saker jag inte får: att använda understreck (medan jag antar att det står för "alla lästa records"?), Och varför är END inte slutet? Om slags kommando skulle det inte misslyckas på ","? Vet du hur du anger "sista fältet" i linje med sort? Eller är något liknande: | Awk '(printf substr ($ NF, 1, length ($ NF) -1); $ NF \u003d "" printf "% s \ n", $ 0)' | sort-n | awk '(printf "% s \ % s \ n ", $ 0, $ 1) '| awk' ($ 1 \u003d" "; sub (/ ^ + /," "); printf"% s \ n ", $ 0) ' föredra? Thanks alot igen radoulov ^ ^ |
|
|||||
|
Citat:
av de viktigaste ($ NF i detta fall) och värdet är alway det sista man ser (den i fil2). Det kommer att associera till varje nyckel ($ NF) hela register ($ 0) och det kommer att uppdatera värdet när man ser samma nyckel. Citat:
det du vill ha koden mer lättläst, Du kan använda denna i stället (och detta är kompatibel även med de gamla släta Solaris awk): Kod:
awk '{
key_record[$NF] = $0 # associate key ($NF) with entire record ($0)
}
END {
# after the entire input has been read
for (key in key_record) # for every key stored
print key_record[key] # print the associated value
}' file1 file2
Citat:
Citat:
I så fall skulle jag gå med: Kod:
perl -lane'
$h{$F[-1]} = $_;
print join "\n", map $h{$_}, sort {$a <=> $b} keys %h
if eof'
Eller (om du verkligen vill bli av med "," medan sortering): Kod:
perl -lane'
chop $F[-1] and $h{$F[-1]} = $_;
print join "\n", map $h{$_}, sort {$a <=> $b} keys %h
if eof'
Annars använder sortera + skal: Kod:
read<file;set -- $REPLY;sort -k$#n file |
|
||||
|
Tack för du tog dig tid att förklara allt detta radoulov ^ ^ That's really great!
Citat:
27.384; 7.384, eller 384; men jag har försökt så många olika saker, jag antar att detta bör förbli en i vissa mistypes / misstag på min sida eller på grund av Windows radslut vissa filer verkar ha (en del filer som har skapats i Windows och en del på Unix)? Nej det sista fältet är inte fast eftersom jag är på en bash-manus verktyg för SQL-frågor filer sortering / uppdatering, detta måste användas på flera olika filer där antalet fält är inte alltid samma sak och där det största värdet kan , men sällan händer, i mitten av linjen. Så i detta fall ta en $ key argument från CLI: awk 'END (for (k i _) print _ [k ]}{_[$'"$ nyckel "']\u003d$ 0)' $ fil1 $ fil2> $ file1.updated med en tilläggstull beroende argument "0" i slutet av raden (eftersom jag inte fick $ nyckel för att förvandlas till NF och awk ta ' "$ key'"). Jag gör det för en liten kommun och det måste vara väldigt enkelt. Om du inte är rädd för att läsa awfull kod jag kan skicka det ^ ^ |
|
||||
|
Hej är mycket nytt att awk & Unix, är min skyldighet mycket liknar detta ..
Jag vill jämföra med första kolumnen, fil1: 0.000-00.058 | Green 0.000-00.059 | Green 0.000-00.060 | Green 0.402-01.055 | Green 0.402-01.058 | Green 0.402-01.059 | Green 0.402-01.061 | Green 0.402-01.065 | Green fil2: 0.000-00.057 | Red 0.000-00.058 | Blue 0.000-00.059 | Red 0.000-00.060 | Blue Mina resultat bör 0.000-00.058 |Blå 0.000-00.059 |Röd 0.000-00.060 |Blå 0.402-01.055 | Green 0.402-01.058 | Green 0.402-01.059 | Green 0.402-01.061 | Green 0.402-01.065 | Green 0.000-00.057 | Red väntar på ditt svar ... Tack u. |
![]() |
| Komihåglista |
| Taggar |
| Solaris |
| Thread Tools | Sök i denna tråd |
| Visningslägen | Betygsätt denna tråd |
|
|