Mam plik podobny do poniższego
var 3 2014 string var1 4 2011 string4 var2 6 1999 string2 var3 1 2016 string6
Następnie mam to podczas gdy pętla odczytu, aby porównać jedną z kolumn z liczbą, a następnie powtórzyć coś. Jednak zamiast powtórzyć moje pożądane wyrażenie, powtarza coś innego.
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}"
zamiast powtórzyć powyższe, powtarza drugą kolumnę pliku.
Komentarze
Odpowiedź
powinieneś spróbować
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
dla mieszanego rozwiązania awk / bash.
Jak zauważyli inni, przekierowanie awk następuje później.
Odpowiedź
Wygląda na to, że „próbujesz przekierować wyjście home/dir/file.txt | awk "{print $2}"
do while
pętla;
najpierw wydaje mi się, że prawidłowa ścieżka powinna być /home/dir/file.txt
(jednak jest to tylko założenie);
sekunda /home/dir/file.txt | awk "{print $2}"
nie „nie przekierowuje zawartości /home/dir/file.txt
do awk
, podczas gdy < /home/dir/file.txt awk "{print $2}"
tak;
Po trzecie, przekierowujesz wyjście polecenia jako plik, ale jest to ciąg znaków i powinieneś przekierować go tak, jak it: <<< "$(< /home/dir/file.txt awk "{print $2}")"
.
Alternatywnie możesz również przesłać dane wyjściowe polecenia bezpośrednio do pętli while
zamiast tego: .
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}")"
lub
< /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
Odpowiedź
Ponieważ nie mogę komentować, po prostu zastanawiam się, dlaczego ludzie nie używali 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 oczekujesz, że wynikiem będzie pojedyncza liczba (którą porównujesz z ciągiem " 0 "), ale w rzeczywistości czytasz plik wejściowy z 4 kolumnami, więc$num
będzie ciągiem zawierającym 4 kolumny.awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt
?while
…done
pętla. To znaczy:is
x4