olvasás közben

Van egy olyan fájlom, mint lent

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

Akkor ezt olvasás közben, hogy összehasonlítsuk az egyik oszlopot egy számmal, majd visszhangozzunk valamit. Azonban ahelyett, hogy a kívánt kifejezésemet visszhangozná, valami mást is visszhangoz.

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

a fentiek visszhangja helyett a fájl 2. oszlopát.

Megjegyzések

  • Nem tudom ' a probléma újratermesztését a szkript futtatásakor, de mindenesetre egyéb problémái vannak a szkriptjével. Főként a read num műveletet hajtja végre, és az eredmény egyetlen számra számít (amelyet összehasonlít a " 0 ), de valójában egy 4 oszlopos bemeneti fájlt olvasol, így $num egy karakterlánc lesz, benne 4 oszloppal.
  • Nincs tesztelve, de szerintem az a problémád, hogy a csövet a while hurok után készítik el? Egyébként miért nem minden az awk-ban: awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
  • Amint bemutattuk, ez a kódrészlet kinyomtatja a … done hurok. Vagyis: is x4

Válasz

meg kell próbálnia

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 

az awk / bash vegyes megoldáshoz.

Amint más megjegyezte, az awk átirányítás később következik be.

Válasz

Úgy tűnik, hogy megpróbálja átirányítani a home/dir/file.txt | awk "{print $2}" kimenetét a while ciklus;

először azt hiszem, hogy a helyes elérési útnak /home/dir/file.txt legyen (azonban ez csak feltételezés);

második /home/dir/file.txt | awk "{print $2}" nem irányítja át a /home/dir/file.txt tartalmat a awk , míg az < /home/dir/file.txt awk "{print $2}";

harmadszor, a parancs kimenetét fájlként átirányítja, de ez karakterlánc, és át kell irányítania it: <<< "$(< /home/dir/file.txt awk "{print $2}")".

Alternatív megoldásként a parancs kimenetét közvetlenül a while hurokba is továbbíthatja ehelyett: .

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

vagy

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

Válasz

Mivel nem tudok hozzászólni, csak kíváncsi vagyok, miért nem használták az emberek az IFS-t

 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 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük