Feltételes blokk vs feltételes utasítás (ha)

Mondja, hogy van fájlom:

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

Azt akarom, hogy minden olyan sor, amelynek száma a második oszlopban 1-től nem egyenlő, 0-ra változtassa, és a többit megtartsa.

Ha a if (azaz feltételes utasítás), minden rendben van:

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

De amikor a feltételes blokkot használom, valami nem kívánt történik:

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 

Láthatja, mi a baj.

  • Hogyan javíthatom ki ezt a hibát?
  • Miért fordul elő ez a hiba?
  • Mi a különbség a feltételes utasítás és a feltételes blokk között?

Válasz

Egy if utasítás, van egy else. Ha a if nem egyezik, akkor a else ág végrehajtásra kerül.

Egy feltételes utasításban mindkét művelet végrehajtva, függetlenül attól, hogy a feltétel igaz vagy hamis.

Egyszerű javítás:

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

És tömörebbé teheti:

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

Ha a feltétel igaz 1 és nincs művelet, awk alapértelmezett viselkedés print. print argumentum nélkül alapértelmezés szerint $0 -t nyomtat.

Megjegyzések

  • Be is golfozhatja awk '$2!=1?$2=0:"";1' file.
  • @ terdon: Jó golfozás. Azt hiszem, ezt nehéz megérteni az OP-nak.
  • @cuonglm el tudná magyarázni a next szerepét. Gondolom, elnyomja a második nyomtatás, ha az első igaz. Valami hasonló: continue itt: C.
  • @Alexander Cska: next elnyomja az aktuális bemeneti sor feldolgozását, ugorjon a következőre. Ugyanaz a szerep, mint a while, de az egész awk programban. Ezenkívül a awk saját while

Válasz

A

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

második blokkja nem feltételes. Minden sorra reagál, és így minden sor.

Ehelyett írjon:

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

Vagy írjon:

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

Ez a feltétel nélküli blokkot kihagyja, ha a feltételes blokk megegyezik.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük