awk if-then-else uttalelsesfeil

Jeg skriver en if-then-else-uttalelse ved hjelp av awk i et bash-skript.

Det jeg vil gjøre er å identifisere linjer med kol 1-verdier som ikke samsvarer med en bestemt streng (rs eller chr) og legge til et prefiks (chr) til kol 1-verdiene for de identifiserte linjene. Alle linjer med den matchede strengen skal skrives ut som de var – ingen vedlegg.

Min kodelinje så langt er:

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

I fortsett å motta syntaksfeilmeldinger med denne koden.

Jeg kan utføre identifikasjonen og tilføyingen vellykket alene, men har problemer med å kombinere dem i en kommando.

Kommentarer

  • sjekk hvor du lukker den andre krøllete braketten: '{ if ( this is given) { do this } else { do that } }'

Svar

Her er koden din, utvidet for synlighet:

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

Det er en rekke problemer med dette som kommer opp i tankene

  1. Du bruker en likestillingssammenligning i stedet for oppdrag for å prøve og legg til chr prefikset
  2. Du har satt det som skal være en oppgave i parentes
  3. Det er en ekstern } etter første
  4. Det skal ikke være noe semikolon før else delen
  5. Du mangler den siste lukkingen } etter koden

Her er en fast versjon, fremdeles utvidet:

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

Og så kan vi se en enkel optimalisering for å flytte den gjentatte print $0 utenfor din tilstand:

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

Siden dette er i utgangspunktet en enkel «tilstand → endre» du kan faktisk bruke awk «s standardstruktur for å forenkle dette ytterligere. Her har vi to awk utsagn, behandlet sekvensielt for hver linje i inndatafilen. Første linje prefikser "chr" etter behov. Den andre skriver ut hver linje.

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

Siden dette er awk, kan den til og med rulles opp til en enkelt linje , selv om lesbarheten lider litt

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

Svar

Å bruke denne linjen ser ut til å fungerer perfekt:

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

Kommentarer

  • ($1 ~ /rs/ || /chr/) vil matche $1 for "rs", men $0 for "chr". Du bør enten ($1 ~ /rs/ || $1 ~ /chr/) eller ($1 ~ /rs|chr/)

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *