kun luetaan silmukkaa

Minulla on alla oleva tiedosto

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

Sitten minulla on tämä luki silmukan verrata yhtä saraketta numeroon ja toistaa sitten jotain. Halutun lauseeni toistamisen sijaan se toistaa kuitenkin jotain muuta.

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

Edellä esitetyn sijaan se toistaa tiedoston 2. sarakkeen.

Kommentit

  • En voi ' t itse toistaa ongelmaa suoritettaessa komentosarjaa sellaisenaan, mutta joka tapauksessa sinulla on muita ongelmia skriptisi kanssa. Pääasiassa teet read num ja oletat, että tulos on yksi numero (jota verrataan merkkijonoon " 0 "), mutta luet itse asiassa syötetiedostoa, jossa on 4 saraketta, joten $num on merkkijono, jossa on 4 saraketta.
  • Ei testattu, mutta mielestäni ongelmasi on, että putki tehdään jonkin aikaa silmukan jälkeen? Joka tapauksessa, miksi ei kaikki awk: awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
  • Kuten esitettiin, kyseinen koodinpätkä tulosta toisen sanan kustakin rivistä, jonka whiledone -silmukka. Eli: is x4

Vastaa

sinun kannattaa yrittää

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 

sekoitetulle awk / bash-ratkaisulle.

Kuten muut ovat huomauttaneet, awk-uudelleenohjaus tapahtuu myöhemmin.

vastaus

Näyttää siltä, että yrität ohjata home/dir/file.txt | awk "{print $2}" -lähtöä while -silmukka;

Ensin luulen, että oikean polun tulisi olla /home/dir/file.txt (mutta tämä on vain oletus);

toinen /home/dir/file.txt | awk "{print $2}" ei ohjaa /home/dir/file.txt -sisältöä awk , kun taas < /home/dir/file.txt awk "{print $2}" tekee;

kolmanneksi, uudelleenohjaat komennon lähdön tiedostona, mutta se on merkkijono, ja sinun tulisi ohjata se uudelleen it: <<< "$(< /home/dir/file.txt awk "{print $2}")".

Vaihtoehtoisesti voit myös lähettää komennon lähdön suoraan while -silmukkaan sen sijaan: .

 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}")"  

tai

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

vastaus

Koska en voi kommentoida, ihmettelen, miksi ihmiset eivät ole käyttäneet 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 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *