while read loop

Ik heb een bestand zoals hieronder

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

Dan heb ik dit while read-lus om een van de kolommen met een getal te vergelijken en vervolgens iets te herhalen. In plaats van mijn gewenste zin te herhalen, echo het echter iets anders.

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

in plaats van het bovenstaande te herhalen, echo het de 2e kolom van het bestand.

Reacties

  • Ik kan ' het probleem niet reproduceren wanneer ik het script as-is, maar in in elk geval heb je andere problemen met je script. U doet voornamelijk read num en verwacht dat het resultaat een enkel getal is (dat u vergelijkt met de tekenreeks " 0 "), maar je leest eigenlijk een invoerbestand met 4 kolommen, dus $num zal een string zijn met 4 kolommen erin.
  • Niet getest, maar ik denk dat jouw probleem is dat de pipe klaar zal zijn na de while-lus? Hoe dan ook, waarom niet alles in awk: awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
  • Zoals gepresenteerd, zou dat codefragment het tweede woord afdrukken van elke regel geproduceerd door de whiledone lus. Dat wil zeggen: is x4

Antwoord

je moet proberen

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 

voor een gemengde awk / bash-oplossing.

Zoals anderen hebben opgemerkt, vindt awk-omleiding later plaats.

Answer

Het lijkt erop dat u “probeert de uitvoer van home/dir/file.txt | awk "{print $2}" om te leiden naar de while loop;

allereerst denk ik dat het juiste pad /home/dir/file.txt zou moeten zijn (dit is echter slechts een aanname);

tweede /home/dir/file.txt | awk "{print $2}" leidt de inhoud van /home/dir/file.txt niet “om naar awk , terwijl < /home/dir/file.txt awk "{print $2}" doet;

ten derde, “herleid je de uitvoer van het commando als een bestand, maar het is een string, en je zou het moeten omleiden als it: <<< "$(< /home/dir/file.txt awk "{print $2}")".

Als alternatief kunt u ook de uitvoer van de opdracht rechtstreeks naar de while -lus sturen in plaats daarvan: .

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

of

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

Antwoord

Aangezien ik geen commentaar kan geven, vraag ik me gewoon af waarom mensen IFS niet hebben gebruikt.

 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 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *