Ehdollinen lohko vs. ehdollinen lause (jos)

Sano, että minulla on tiedosto:

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

Haluan, että jokainen rivi, jonka toisessa sarakkeessa on erilainen luku kuin 1, muuttaa sen arvoksi 0 ja pitää loput.

Jos käytän if (ts. ehdollinen lause), kaikki on OK:

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

Mutta kun käytän ehdollista lohkoa, tapahtuu jotain ei-toivottua:

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 

Näet, mikä on vialla.

  • Kuinka korjaan tämän virheen?
  • Miksi tämä virhe tapahtuu?
  • Mitä eroa ehdollisen lauseen ja ehdollisen lauseen välillä on?

Vastaa

if -lauseke, sinulla on else. Jos if ei täsmää, haara else suoritetaan.

Ehdollisessa lauseessa molemmat toiminnot ovat suoritetaan riippumatta siitä, onko ehto tosi vai väärä.

Yksinkertainen korjaus:

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

Ja voit tehdä siitä suppeamman:

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

Kun ehto on tosi 1 ja toimintoa ei ole, awk oletuskäyttäytyminen on print. print ilman argumenttia tulostaa oletuksena $0.

kommentit

  • Voit myös golfata sen osastoon awk '$2!=1?$2=0:"";1' file.
  • @ terdon: Hyvä golfaus. Luulen, että OP: n voi olla vaikea ymmärtää sitä.
  • @cuonglm Voisitko selittää next: n roolin. Luulen, että se tukahduttaa toinen tulos, jos ensimmäinen on totta. Jotain continue muodossa C.
  • @Alexander Cska: next estää nykyisen syöttörivin käsittelyn, siirry seuraavaan. Sama rooli kuin while, mutta koko ohjelmalle awk. Lisäksi awk on oma while

vastaus

Toinen lohko

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

ei ole ehdollinen. Sitä käytetään jokaisella rivillä ja se tulostaa siten jokainen rivi.

Kirjoita sen sijaan:

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

Tai kirjoita:

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

Tämä johtaa ehdottoman lohkon ohittamiseen, jos ehdollinen lohko täsmää.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *