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
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
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.awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt
?while
…done
buclă. Adică:is
x4