Скажем, у меня есть файл:
PRO 1
GLN 5.55112e-17
ILE -6.245e-17
THR 5.55112e-17
Я хочу, чтобы каждая строка, имеющая число, не равное 1, во втором столбце изменила его на 0 и оставила остаток.
Если я использую if
(то есть условное утверждение), все в порядке:
awk '{if($2!=1){print $1,"0"}else{print $0}}' file
PRO 1
GLN 0
ILE 0
THR 0
Но когда я использую условный блок, происходит что-то нежелательное:
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
Вы можете видеть, что не так.
- Как я могу исправить эту ошибку?
- Почему возникает эта ошибка?
- Чем отличается условный оператор от условного блока?
awk '$2!=1?$2=0:"";1' file
.next
. Я предполагаю, что это подавляет второй отпечаток, если первый - правда. Что-то вродеcontinue
вC
.next
подавляет обработку текущей строки ввода, переход к следующей. Та же роль, чтоwhile
и для всейawk
программы. Кроме того,awk
есть своиwhile
Второй блок в
не условно. Он обрабатывается для каждой строки и, таким образом, печатает каждую строку.
Вместо этого напишите:
Или напишите:
Это приведет к пропуску безусловного блока, если сопоставлен условный блок.
источник