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
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
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.awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt
?while
…done
lus. Dat wil zeggen:is
x4