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
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ää.
awk '$2!=1?$2=0:"";1' file
.next
: n roolin. Luulen, että se tukahduttaa toinen tulos, jos ensimmäinen on totta. Jotaincontinue
muodossaC
.next
estää nykyisen syöttörivin käsittelyn, siirry seuraavaan. Sama rooli kuinwhile
, mutta koko ohjelmalleawk
. Lisäksiawk
on omawhile