medan lässlinga

Jag har en fil som en nedan

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

Sedan har jag detta medan du läser slingan för att jämföra en av kolumnerna med ett nummer och sedan upprepa något. Istället för att eka min önskade fras, upprepar det något annat.

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

istället för att echo ovan, ekar det den andra kolumnen i filen.

Kommentarer

  • Jag kan ' t återge faktiskt problemet när man kör skriptet som det är, men i i alla fall har du andra problem med ditt skript. I huvudsak gör du read num och förväntar dig att resultatet blir ett enda tal (som du jämför med strängen " 0 "), men du läser faktiskt en inmatningsfil med fyra kolumner så $num kommer att vara en sträng med fyra kolumner i den.
  • Inte testad, men jag tror att ditt problem är att röret kommer att göras efter stundslingan? Hur som helst, varför inte allt i awk: awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
  • Som presenterat skulle det kodavsnittet skriva ut det andra ordet från varje rad som produceras av whiledone loop. Dvs: is x4

Svar

du ska försöka

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 

för en blandad awk / bash-lösning.

Som andra har påpekat sker awk-omdirigering senare.

Svar

Det verkar som om du försöker omdirigera utdata från home/dir/file.txt | awk "{print $2}" till while loop;

först antar jag att rätt sökväg ska vara /home/dir/file.txt (dock är detta bara ett antagande);

andra /home/dir/file.txt | awk "{print $2}" omdirigerar inte innehållet i /home/dir/file.txt till awk , medan < /home/dir/file.txt awk "{print $2}" gör;

för det tredje omdirigerar du kommandot som en fil, men det är en sträng och du bör omdirigera det som it: <<< "$(< /home/dir/file.txt awk "{print $2}")".

Alternativt kan du också leda utdata från kommandot direkt till while loop istället: .

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

eller

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

Svar

Eftersom jag inte kan kommentera, undrar jag bara varför människor inte har använt 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 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *