Angenommen, ich habe eine Datei:
PRO 1
GLN 5.55112e-17
ILE -6.245e-17
THR 5.55112e-17
Ich möchte, dass jede Zeile mit einer Zahl ungleich 1 in der zweiten Spalte in 0 geändert wird und der Rest beibehalten wird.
Wenn ich eine if
bedingte Anweisung verwende, ist alles in Ordnung:
awk '{if($2!=1){print $1,"0"}else{print $0}}' file
PRO 1
GLN 0
ILE 0
THR 0
Aber wenn ich den bedingten Block verwende, passiert etwas Unerwünschtes:
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
Sie können sehen, was los ist.
- Wie behebe ich diesen Fehler?
- Warum tritt dieser Fehler auf?
- Was ist der Unterschied zwischen einer bedingten Anweisung und einem bedingten Block?
awk '$2!=1?$2=0:"";1' file
.next
. Ich vermute, es unterdrückt den zweiten Ausdruck, wenn der erste wahr ist. So etwas wiecontinue
inC
.next
unterdrückt die Verarbeitung der aktuellen Eingabezeile, springe zur nächsten. Die gleiche Rolle wiewhile
, aber für das gesamteawk
Programm. Auchawk
hat seine eigenewhile
Der zweite Block in
ist nicht bedingt. Es wird für jede Zeile ausgeführt und gibt somit jede Zeile aus.
Schreiben Sie stattdessen:
Oder schreiben:
Dadurch wird der unbedingte Block übersprungen, wenn der bedingte Block übereinstimmt.
quelle