Koşullu blok ve koşullu deyim karşılaştırması (if)


18

Diyelim ki bir dosyam var:

PRO 1
GLN 5.55112e-17
ILE -6.245e-17
THR 5.55112e-17

İkinci sütunda 1'e eşit olmayan bir sayıya sahip her satırın 0 olarak değiştirilmesini ve geri kalanının korunmasını istiyorum.

Ben kullanırsanız if(yani şartlı deyimi), herşey yolundadır:

awk '{if($2!=1){print $1,"0"}else{print $0}}' file
PRO 1
GLN 0
ILE 0
THR 0

Ancak koşullu bloğu kullandığımda istenmeyen bir şey oluyor:

awk '$2!=1 {print $1,"0"} {print $0}' file
PRO 1
GLN 0
GLN 5.55112e-17
ILE 0
ILE -6.245e-17
THR 0
THR 5.55112e-17

Neyin yanlış olduğunu görebilirsiniz.

  • Bu hatayı nasıl düzeltirim?
  • Bu hata neden oluşuyor?
  • Koşullu ifade ile koşullu blok arasındaki fark nedir?

Yanıtlar:


26

Bir ifaçıklamada, bir else. Eğer ifuymuyor, elseşube yürütülür.

Koşullu bir ifadede, koşul doğru veya yanlış olursa olsun her iki eylem de yürütülür.

Basit bir düzeltme:

$ awk '$2!=1 {print $1,"0";next};{print $0}' file
PRO 1
GLN 0
ILE 0
THR 0

Ve daha özlü yapabilirsiniz:

$ awk '$2 != 1 {print $1,"0";next};1' file
PRO 1
GLN 0
ILE 0
THR 0

Koşul doğruysa 1ve eylem yoksa, awkvarsayılan davranış budur print. printhiçbir argüman $0varsayılan olarak yazdırılmaz .


4
Ayrıca içine golf olabilir awk '$2!=1?$2=0:"";1' file.
terdon

@terdon: İyi golf. Bence bunu anlamak OP için zor olabilir.
cuonglm

1
@cuonglm rolünü açıklayabilir misiniz next? Birincisi doğruysa ikinci baskıyı bastırıyor sanırım. Gibi bir şey continueiçinde C.
Alexander Cska

@Alexander Cska: nextmevcut giriş hattını işlemeyi bastırır, bir sonrakine atlar. Aynı rol while, ancak tüm awkprogram için. Ayrıca, awkkendi vardırwhile
cuonglm

10

İkinci blok

awk '$2!=1 {print $1,"0"} {print $0}' file

şartlı değil. Her satır için harekete geçer ve böylece her satırı yazdırır.

Bunun yerine şunu yazın:

awk '$2!=1 {print $1,"0"} $2==1 {print $0}' file

Yada yaz:

awk '$2!=1 {print $1,"0"; next} {print $0}' file

Bu, koşullu blok eşleşirse koşulsuz bloğun atlanmasına neden olur.

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.