Ich schreibe eine if-then-else-Anweisung mit awk in einem Bash-Skript.
Ich möchte Zeilen mit Spaltenwerten identifizieren, die nicht mit einer bestimmten Zeichenfolge (rs oder chr) übereinstimmen, und den Spaltenwerten für diese identifizierten Zeilen ein Präfix (chr) hinzufügen. Alle Zeilen mit der übereinstimmenden Zeichenfolge sollten so gedruckt werden, wie sie waren – kein Anhängen.
Meine bisherige Codezeile lautet:
awk "{if (! ($1 ~ /rs/ || $1 ~ /chr/)) {($1 == "chr"$1); print $0}}; else {print $0}" filename > newfilename
I. Empfangen Sie weiterhin Syntaxfehlermeldungen mit diesem Code.
Ich kann die Identifizierung und das Anhängen selbst erfolgreich durchführen, habe jedoch Probleme, sie zu einem Befehl zu kombinieren.
Kommentare
- Überprüfen Sie, wo Sie diese zweite geschweifte Klammer schließen:
'{ if ( this is given) { do this } else { do that } }'
Antwort
Hier ist Ihr Code, der zur besseren Sichtbarkeit erweitert wurde:
awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { ($1 == "chr"$1); print $0} }; else { print $0 } " filename > newfilename
Es gibt eine Reihe von Problemen, die in den Sinn kommen.
- Sie verwenden einen Gleichheitsvergleich anstelle einer Zuweisung, um dies zu versuchen und fügen Sie das Präfix
chr
- hinzu. Sie haben eine Zuweisung in Klammern gesetzt.
- Es gibt eine fremde
}
nach dem ersten - Vor dem Teil
else
- sollte kein Semikolon stehen. Sie haben den endgültigen Abschluss
}
nach dem Code
Hier ist eine feste Version, die noch erweitert ist:
awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1; print $0 } else { print $0 } } " filename > newfilename
Und dann sehen wir eine einfache Optimierung, um das wiederholte print $0
außerhalb Ihres Zustands zu verschieben:
awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 } print $0 } " filename > newfilename
Seit Dies ist im Grunde eine einfache „Bedingung → Änderung“. Sie können die Standardstruktur von awk
verwenden, um dies weiter zu vereinfachen. Hier haben wir zwei awk
-Anweisungen, die nacheinander für jede Zeile Ihrer Eingabedatei verarbeitet werden. Die erste Zeile stellt bei Bedarf "chr"
voran. Die zweite druckt jede Zeile.
awk " (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 } 1 " filename > newfilename
Da dies awk
ist, kann sie sogar in eine einzelne Zeile zusammengefasst werden , obwohl die Lesbarkeit ein wenig leidet
awk "(! ($1 ~ /rs|chr/) ) { $1 = "chr" $1 } 1" filename > newfilename
Antwort
Die Verwendung dieser Zeile scheint zu sein funktionieren perfekt:
awk "!($1 ~ /rs/ || /chr/) {$1="chr"$1}1"
Kommentare
-
($1 ~ /rs/ || /chr/)
stimmt mit$1
für"rs"
überein, aber$0
für"chr"
. Sie sollten entweder($1 ~ /rs/ || $1 ~ /chr/)
oder($1 ~ /rs|chr/)