podczas pętli czytania

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

  • Nie mogę ' nie odtworzyć problemu podczas uruchamiania skryptu w takiej postaci, w każdym razie masz inne problemy ze swoim skryptem. Zwykle robisz 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.
  • Nie testowane, ale myślę, że twój problem polega na tym, że rura zostanie wykonana po pętli while? W każdym razie, dlaczego nie wszystko w awk: awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
  • Jak przedstawiono, ten fragment kodu wypisuje drugie słowo z każdego wiersza utworzonego przez whiledone pętla. To znaczy: is x4

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 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *