mens læs sløjfe

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 læser sløjfe for at sammenligne en af kolonnerne med et tal og derefter ekko noget. I stedet for at gentage min ønskede sætning ekko det dog noget andet.

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 at gentage ovenstående ekko det 2. kolonne i filen.

Kommentarer

  • Jeg kan ' t gengiver faktisk problemet, når scriptet køres som det er, men i Under alle omstændigheder har du andre problemer med dit script. Hovedsageligt gør du read num og forventer, at resultatet bliver et enkelt tal (som du sammenligner med strengen " 0 "), men du læser faktisk en inputfil med 4 kolonner, så $num vil være en streng med 4 kolonner i.
  • Ikke testet, men jeg tror, at dit problem er, at røret skal gøres efter while-sløjfen? Under alle omstændigheder, hvorfor ikke alt sammen i awk: awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
  • Som præsenteret, ville kodestykket udskrive det andet ord fra hver linje produceret af whiledone loop. Dvs. is x4

Svar

du skal 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åpeget, sker awk-omdirigering senere.

Svar

Det ser ud til, at du “prøver at omdirigere output fra home/dir/file.txt | awk "{print $2}" til while loop;

først antager jeg, at den rigtige sti skal være /home/dir/file.txt (dog er dette kun en antagelse);

andet /home/dir/file.txt | awk "{print $2}" omdirigerer ikke indholdet af /home/dir/file.txt til awk , mens < /home/dir/file.txt awk "{print $2}" gør;

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

Alternativt kan du også lede kommandoens output 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

Da jeg ikke kan kommentere, bare undrende, hvorfor folk ikke har brugt 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 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *