The UNIX and Linux Forums  
Hej och välkommen från USA till UNIX och Linux Forum! Tack för ditt besök och gå med i vår globala gemenskapen.

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
loop problem hage Shell-programmering och Skript 2 09-23-2008 10:15
För loop problem mdap Shell-programmering och Skript 3 08-16-2008 01:27
Problem i För loop The Observer Shell-programmering och Skript 2 05-28-2008 02:43
Problem med medan loop och SQL nandajk UNIX for Dummies Frågor & Svar 20 05-04-2007 06:19
Problemet med medan loop mridula High Level Programming 1 12-11-2005 11:44

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 11-16-2008
dawn_1030 dawn_1030 is offline
Registered User
  
 

Join Date: Nov 2008
Inlägg: 2
Double medan loop problem

Hej alla, jag har stött på ett märkligt problem med dubbla medan loop. Syftet med de båda samtidigt loopar är att jämföra 2 filer, tmplist.txt är Referensfil med den kompletta listan över servrar. Se den bifogade bilden för logik och förhållandet mellan input och output.

Den 2 medan loopar ska söka servrar i / test.csv i / tmplist.txt, rad för rad. Till exempel, sök första punkten i / test.csv server2 i / tmplist.txt, från första raden i / tmplist.txt (LINENUM \u003d 1), om inte funnit sedan utgångsenergi en "NA" och sedan gå till nästa rad i / tmplist.txt tills den hittar de matchande server2, och uppdatera LINENUM samtidigt. Else kommer att fortsätta att söka nästa server server3 i / tmplist.txt från nuvarande linje och framåt (eftersom alla servrar är alltid anges i alphabatic ordning).

Den rörliga LINENUM (indikator på linje nummer) som används i innerstaden medan loop. Det är fördefinierade som 1, efter det, om villkoret om [$ SERVER \u003d $ Refs] är sant, LINENUM att öka och sedan bryta ut innerstaden medan loop och fortsätta i den yttre medan loop. Men i den yttre medan loop, varje gång det loopar och lyder SERVER COUNT, det LINENUM startar från begynnelsevärde 1 gång i stället för från ökas LINENUM från innerstaden medan loop.


Nedan visas en del av programmet med information om 2 medan loopar.
Kan någon hjälpa till att förklara för mig vad som är fel här? Detta är min första UNIX uppdrag, verkligen kommer att uppskatta din hjälp!


#! / bin / bash
Type \u003d P2PS
LINENUM \u003d 1

samtidigt läsa SERVER COUNT, göra

katt tmplist.txt | samtidigt läsa LINE; göra

Refs \u003d $ (huvud - $ LINENUM tmplist.txt | tail -1)

om [$ SERVER \u003d $ Refs]; sedan
Låt LINENUM + +
echo-n "," $ COUNT>> t.csv
bryta
annan
Låt LINENUM + +
echo-n ", NA">> t.csv
fortsätta
fi
gjord

gjort <test.csv
Bifogade bilder
File Type: bmp untitled.bmp (177,0 KB, 13 visningar)
  #2 (permalänk)  
Old 11-16-2008
Perderabo's Avatar
Perderabo Perderabo is offline Forum Staff  
Unix Daemon
  
 

Join Date: Aug 2001
Ort: Ashburn, Virginia
Inlägg: 9.111
I den inre slingan är en sub-process. Allt förändrats har det ingen effekt på moderbolagets process. Det är samma situation som

X \u003d 1
bash-c "X \u003d 2"
echo $ X

Båda dina loopar läser från stdin. Varje process har endast 1 stdin så att dina två loopar absolut måste separata processer.
  #3 (permalänk)  
Old 11-16-2008
läskigt krympling creepy cripple is offline
Registered User
  
 

Join Date: oktober 2008
Inlägg: 2
Det finns inget behov av 2 slingor måste du använda kraftfulla UNIX kommandon i ditt manus, precis som grep. Detta borde fungera:
Naturligtvis t.csv måste vara tom innan den verkställer skriptet.

samtidigt läsa LINE
göra
aux \u003d $ (grep $ LINE test.csv)
om [[! -z $ aux]]
sedan
echo "$ aux">> t.csv
annan
echo "NA">> t.csv
fi
gjort <tmplist.txt
  #4 (permalänk)  
Old 11-16-2008
elbrand elbrand is offline
Registered User
  
 

Join Date: april 2008
Ort: Wolfenbuettel / Tyskland
Inlägg: 12
att läsa i den inre slingan är en subprocess. Alla variabelvärden fastställts eller ändrats i den inre slingan är inte kända utanför den. Om filerna är små försök att byta ut medan-bygga mot en for-loop. Om inte, lagra meta-information i innerstaden loop i filer för att ha dem utanför. Men detta kan minska hastigheten så mycket.
Men egentligen ser jag inte behovet av dubbla slingor. Varför inte grep varje linje från tmplist.txt den första filen?
  #5 (permalänk)  
Old 11-16-2008
Franklin52 Franklin52 is offline Forum Staff  
Moderator
  
 

Join Date: februari 2007
Inlägg: 4.295
En lösning med awk:
Kod:
awk '
NR==FNR{a[$1]=$2;next}
$0 in a{print $0,a[$0];next}
{print "NA"}
' test.csv tmplist.txt > t.csv
  #6 (permalänk)  
Old 11-17-2008
dawn_1030 dawn_1030 is offline
Registered User
  
 

Join Date: Nov 2008
Inlägg: 2
Tack så mycket för era svar! Riktigt kraftfull kommandon!
Mitt script fungerar nu. Tack alla!
Closed Thread

Komihåglista

Taggar
UNIX-kommandon

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 06:45.


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