în timp ce bucla de citire

Am un fișier ca unul de mai jos

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

Atunci am acest lucru în timp ce citiți bucla pentru a compara una dintre coloane cu un număr, apoi ecou ceva. Cu toate acestea, în loc să reamintească fraza mea dorită, ea răsună cu altceva.

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

în loc să reamintească cele de mai sus, răsună a doua coloană a fișierului.

Comentarii

  • ' nu pot reproduce efectiv problema când rulez scriptul ca atare, dar în în orice caz, aveți alte probleme cu scriptul. În principal, faceți read num și vă așteptați ca rezultatul să fie un singur număr (pe care îl comparați cu șirul " 0 "), dar citiți de fapt un fișier de intrare cu 4 coloane, astfel încât $num va fi un șir cu 4 coloane.
  • Nu a fost testat, dar cred că problema ta este că conducta se va face după bucla while? Oricum, de ce nu toate în awk: awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
  • După cum s-a prezentat, acel fragment de cod ar imprima al doilea cuvânt din fiecare linie produsă de whiledone buclă. Adică: is x4

Răspuns

ar trebui să încercați

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 

pentru o soluție mixtă awk / bash.

După cum au subliniat alții, redirecționarea awk are loc mai târziu.

Răspuns

Se pare că încercați să redirecționați ieșirea home/dir/file.txt | awk "{print $2}" către while loop;

mai întâi cred că calea corectă ar trebui să fie /home/dir/file.txt (totuși aceasta este doar o presupunere);

second /home/dir/file.txt | awk "{print $2}" nu „redirecționează conținutul /home/dir/file.txt către awk , în timp ce < /home/dir/file.txt awk "{print $2}" face;

în al treilea rând, redirecționați ieșirea comenzii ca fișier, dar este un șir și ar trebui să o redirecționați ca it: <<< "$(< /home/dir/file.txt awk "{print $2}")".

De asemenea, alternativ, puteți transmite ieșirea comenzii direct la bucla while în schimb: .

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

sau

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

Răspuns

Deoarece nu pot să comentez, mă întreb doar de ce oamenii nu au folosit 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 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *