awk if-then-else uttalande fel

Jag skriver ett if-then-else uttalande med awk i ett bash-skript.

Vad jag skulle vilja göra är att identifiera rader med kol 1-värden som inte matchar en viss sträng (rs eller chr) och lägga till ett prefix (chr) till kol 1-värdena för de identifierade raderna. Alla rader med den matchade strängen ska skriva ut som de var – inget tillägg.

Min kodrad hittills är:

awk "{if (! ($1 ~ /rs/ || $1 ~ /chr/)) {($1 == "chr"$1); print $0}}; else {print $0}" filename > newfilename 

I fortsätt att ta emot syntaxfelmeddelanden med den här koden.

Jag kan utföra identifieringen och tillägget framgångsrikt på egen hand men har problem att kombinera dem i ett kommando.

Kommentarer

  • kolla var du stänger den andra lockiga fästet: '{ if ( this is given) { do this } else { do that } }'

Svar

Här är din kod, utökad för synlighet:

awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { ($1 == "chr"$1); print $0} }; else { print $0 } " filename > newfilename 

Det finns ett antal problem med detta som kommer att tänka på

  1. Du använder en jämförelsejämförelse istället för uppdrag för att försöka och lägg till chr prefixet
  2. Du har lagt vad som ska vara en uppgift inom parentes
  3. Det finns en extern } efter den första
  4. Det borde inte finnas något semikolon innan else delen
  5. Du saknar den sista stängningen } efter koden

Här är en fast version, fortfarande utökad:

awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1; print $0 } else { print $0 } } " filename > newfilename 

Och då kan vi se en enkel optimering för att flytta den upprepade print $0 utanför ditt tillstånd:

awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 } print $0 } " filename > newfilename 

Sedan detta är i grunden ett enkelt ”villkor → ändra” du kan faktiskt använda awk ”s standardstruktur för att förenkla detta ytterligare. Här har vi två awk uttalanden, behandlade sekventiellt för varje rad i din inmatningsfil. Första raden prefixar "chr" efter behov. Den andra skriver ut varje rad.

awk " (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 } 1 " filename > newfilename 

Eftersom det här är awk kan den till och med rullas upp till en enda rad , även om läsbarheten lider lite

awk "(! ($1 ~ /rs|chr/) ) { $1 = "chr" $1 } 1" filename > newfilename 

Svar

Att använda den här raden verkar fungerar perfekt:

awk "!($1 ~ /rs/ || /chr/) {$1="chr"$1}1" 

Kommentarer

  • ($1 ~ /rs/ || /chr/) matchar $1 för "rs", men $0 för "chr". Du bör antingen ($1 ~ /rs/ || $1 ~ /chr/) eller ($1 ~ /rs|chr/)

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *