okurken döngü


5

Aşağıdaki gibi bir dosyam var

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

Sonra sütunlardan birini bir sayı ile karşılaştırmak için okuma döngüsü sırasında bunu yaptıktan sonra bir şey yankılanıyorum. Ancak, istediğim ifadeyi tekrarlamak yerine, başka bir şeyi tekrarlar.

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

Yukarıdakileri yankılamak yerine, dosyanın ikinci sütununu yankılanır.


Komut dosyasını olduğu gibi çalıştırırken aslında sorunu yeniden oluşturamıyorum, ancak her durumda komut dosyanızla ilgili başka sorunlarınız var. Genelde, read numsonucun tek bir sayı olmasını bekler ve bekler ("0" dizesiyle karşılaştırırsınız), ancak aslında 4 sütunlu bir girdi dosyası okuyorsunuz, böylece 4 sütunlu $numbir dize olacak.
Celada

1
Test edilmedi, ama bence senin problemin borunun while döngüsünden sonra yapılması mı? Neyse, neden hepsi awk değil awk '{if ($2==0){print "equal"}else{print "not"}}' file.txt?
fredtantini

Sunulduğu gibi, bu kod parçacığı while... donedöngüsünün ürettiği her satırdan ikinci kelimeyi yazdıracaktı . Yani: isx4
Henk Langeveld

Yanıtlar:


5

denemelisin

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 

karışık awk / bash çözeltisi için.

Diğerlerinin de belirttiği gibi, awk yönlendirmeleri daha sonra gerçekleşir.


3

Eğer çıktısını yönlendirmek için çalışıyoruz gibi görünüyor home/dir/file.txt | awk '{print $2}'için whiledöngü;

ilk önce doğru yolun olması gerektiğini tahmin ediyorum /home/dir/file.txt(ancak bu sadece bir varsayımdır);

ikinci /home/dir/file.txt | awk '{print $2}'içeriğini yönlendirmezse /home/dir/file.txtiçin awkise, < /home/dir/file.txt awk '{print $2}'yapar;

Üçüncü, bir dosya olarak komutun çıktısını yönlendiriyoruz, ama bir dize var ve bunu gibi yönlendirmesi gerekir: <<< "$(< /home/dir/file.txt awk '{print $2}')".

Ayrıca alternatif olarak, doğrudan boru komutunun çıktısını yaparsın whileyerine döngü: < /home/dir/file.txt awk '{print $2}' | while read num.

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

veya

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

2

Yorum yapamadığımdan, merak ediyorum, neden insanlar IFS'i kullanmadılar?

IFS = "" var ise rakam num yıl dizisi
yap
  eğer [[$ num -eq 0]]; sonra
    echo "Sayı sıfıra eşittir"
  Başka
    echo "sayı 0'a eşit değil"
  fi
 <home / dir / file.txt yapıldı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.