awk if-then-else-Anweisungsfehler

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.

  1. Sie verwenden einen Gleichheitsvergleich anstelle einer Zuweisung, um dies zu versuchen und fügen Sie das Präfix chr
  2. hinzu. Sie haben eine Zuweisung in Klammern gesetzt.
  3. Es gibt eine fremde } nach dem ersten
  4. Vor dem Teil else
  5. 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/)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.