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
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.
awk '$2!=1?$2=0:"";1' file
.next
szerepét. Gondolom, elnyomja a második nyomtatás, ha az első igaz. Valami hasonló:continue
itt:C
.next
elnyomja az aktuális bemeneti sor feldolgozását, ugorjon a következőre. Ugyanaz a szerep, mint awhile
, de az egészawk
programban. Ezenkívül aawk
sajátwhile