mens lesesløyfe

Jeg har en fil som en nedenfor

var 3 2014 string var1 4 2011 string4 var2 6 1999 string2 var3 1 2016 string6 

Så har jeg dette mens du leser sløyfen for å sammenligne en av kolonnene med et tall, og ekko noe. Imidlertid, i stedet for å ekko min ønsket setning, ekko det noe annet.

while read num do if [ "$num" = "0" ]; then echo "Number is equal to zero" else echo "number is not equal to 0" fi done < home/dir/file.txt | awk "{print $2}" 

i stedet for å ekko ovenfor, ekko det 2. kolonne i filen. p>

Kommentarer

  • Jeg kan ' t faktisk gjengi problemet når du kjører skriptet som det er, men i uansett har du andre problemer med skriptet. Hovedsakelig gjør du read num og forventer at resultatet skal være et enkelt tall (som du sammenligner med strengen " 0 "), men du leser faktisk en inndatafil med 4 kolonner, så $num vil være en streng med 4 kolonner i.
  • Ikke testet, men jeg tror problemet ditt er at røret vil bli gjort etter mens loop? Uansett, hvorfor ikke alt i awk: awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
  • Som presentert, vil kodebiten skrive ut det andre ordet fra hver linje produsert av whiledone loop. Dvs: is x4

Svar

du bør prøve

awk "{print $2}" home/dir/file.txt | while read num do if [ "$num" = "0" ]; then echo "Number is equal to zero" else echo "number is not equal to 0" fi done 

for en blandet awk / bash-løsning.

Som andre har påpekt, skjer awk-omdirigering senere.

Svar

Det ser ut til at du prøver å omdirigere utdata fra home/dir/file.txt | awk "{print $2}" til while loop;

først antar jeg at riktig bane skal være /home/dir/file.txt (men dette er bare en antagelse);

andre /home/dir/file.txt | awk "{print $2}" omdirigerer ikke innholdet i /home/dir/file.txt til awk , mens < /home/dir/file.txt awk "{print $2}" gjør;

for det tredje omdirigerer du utdataene fra kommandoen som en fil, men den er en streng, og du bør omdirigere den som it: <<< "$(< /home/dir/file.txt awk "{print $2}")".

Alternativt kan du også lede utgangen av kommandoen direkte til while loop i stedet: .

 while read num do if [ "$num" = "0" ]; then echo "Number is equal to zero" else echo "number is not equal to 0" fi done <<< "$(< /home/dir/file.txt awk "{print $2}")"  

eller

 < /home/dir/file.txt awk "{print $2}" | while read num do if [ "$num" = "0" ]; then echo "Number is equal to zero" else echo "number is not equal to 0" fi done  

Svar

Siden jeg ikke kan kommentere, bare lurer på, hvorfor folk ikke har brukt IFS

 while IFS=" " read var num year string do if [[ $num -eq 0 ]]; then echo "Number is equal to zero" else echo "number is not equal to 0" fi done < home/dir/file.txt 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *