Powiedz, że mam plik:
PRO 1
GLN 5.55112e-17
ILE -6.245e-17
THR 5.55112e-17
Chcę, aby każdy wiersz, który ma liczbę nierówną do 1 w drugiej kolumnie, zmienił go na 0 i zatrzymał resztę.
Jeśli używam if
(tj. Instrukcji warunkowej), wszystko jest w porządku:
awk '{if($2!=1){print $1,"0"}else{print $0}}' file
PRO 1
GLN 0
ILE 0
THR 0
Ale kiedy używam bloku warunkowego, dzieje się coś niepożądanego:
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
Możesz zobaczyć, co jest nie tak.
- Jak naprawić ten błąd?
- Dlaczego występuje ten błąd?
- Czym różni się instrukcja warunkowa od bloku warunkowego?
awk '$2!=1?$2=0:"";1' file
.next
. Sądzę, że pomija drugi wydruk, jeśli pierwszy jest prawdziwy. Coś jakcontinue
wC
.next
wstrzymuje przetwarzanie bieżącej linii wejściowej, przejdź do następnej. Ta sama rolawhile
, ale dla całegoawk
programu. Ponadtoawk
ma swój własnywhile
Drugi blok w
nie jest warunkowy. Działa na każdą linię, a zatem drukuje każdą linię.
Zamiast tego napisz:
Lub napisz:
Spowoduje to pominięcie bloku bezwarunkowego, jeśli zostanie dopasowany blok warunkowy.
źródło