The UNIX and Linux Forums  


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

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 06-09-2008
mecano mecano is offline
Registered User
  
 

Join Date: juni 2008
Inlägg: 4
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: /
  #2 (permalänk)  
Old 06-09-2008
radoulov's Avatar
radoulov radoulov is offline Forum Staff  
missbrukare
  
 

Join Date: Jan 2007
Ort: Варна, България / Milano, Italia
Inlägg: 2.926
Om beslutet inte är viktigt:

(använd nawk eller / usr/xpg4/bin/awk på Solaris)


Kod:
awk 'END{for(k in _)print _[k]}{_[$NF]=$0}' file1 file2

Annars, med tanke på ditt exempel:


Kod:
awk 'END{for(k in _)print _[k]}{_[$NF]=$0}' file1 file2 |
  sort -k3n


Senast redigerad av radoulov; 06-09-2008 at 10:39..
  #3 (permalänk)  
Old 06-09-2008
mecano mecano is offline
Registered User
  
 

Join Date: juni 2008
Inlägg: 4
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 ^ ^
  #4 (permalänk)  
Old 06-09-2008
radoulov's Avatar
radoulov radoulov is offline Forum Staff  
missbrukare
  
 

Join Date: Jan 2007
Ort: Варна, България / Milano, Italia
Inlägg: 2.926
Citat:
Ursprungligen postat av mecano View Post
[...]
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 ...
[...]
Det använder en associativ array (en hash), så det garanterar unika
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:
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?
Well, this is kinda sätt att skriva,
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:
Om slags kommando skulle det inte misslyckas på ","?
Jag tror att sortera kommandot kommer att kasta den på rätt sätt. Har du ett exempel där den ingående som det här är inte sorteras på rätt sätt?

Citat:
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?
Varför? Är inte det sista fältet position fast?
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

  #5 (permalänk)  
Old 06-09-2008
mecano mecano is offline
Registered User
  
 

Join Date: juni 2008
Inlägg: 4
Tack för du tog dig tid att förklara allt detta radoulov ^ ^ That's really great!

Citat:
Jag tror att sortera kommandot kommer att kasta den på rätt sätt. Har du ett exempel där den ingående som det här är inte sorteras på rätt sätt?
väl inte i det specifika fallet, men jag minns att skala av "," att kunna använda "sort-n 'rätt sätt (utan att ange en nyckel, jag bara extrahera senast fält med awk sedan använda sort-n till det. En skam 'sort' tillåter inte vända nyckel urval), till exempel med värden som:
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 ^ ^
  #6 (permalänk)  
Old 06-10-2008
radoulov's Avatar
radoulov radoulov is offline Forum Staff  
missbrukare
  
 

Join Date: Jan 2007
Ort: Варна, България / Milano, Italia
Inlägg: 2.926
Citat:
[...]
Om du inte är rädd för att läsa awfull kod jag kan skicka det ^ ^
Ja, naturligtvis, post it.
Du kan få användbara råd här.
  #7 (permalänk)  
Old 09-12-2008
s.rajkumar s.rajkumar is offline
Registered User
  
 

Join Date: Aug 2008
Inlägg: 1
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.
Closed Thread

Komihåglista

Taggar
Solaris

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 03:20.


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