awk if-then-else -lausekevirhe

Kirjoitan if-then-else-käskyn käyttäen awk-komentosarjaa.

Haluan tehdä sen, että tunnistetaan rivit, joiden sarakkeiden 1 arvot eivät sovi tiettyyn merkkijonoon (rs tai chr), ja lisää etuliite (chr) näiden tunnistettujen rivien kolon 1 arvoihin. Kaikkien rivien, joiden merkkijono on sovitettu, tulee tulostaa sellaisina kuin ne olivat – ei liitetty.

Koodirivini on toistaiseksi:

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

I jatka syntaksivirheilmoitusten vastaanottamista tällä koodilla.

Voin suorittaa tunnistuksen ja liittämisen onnistuneesti yksin, mutta minulla on vaikeuksia yhdistää ne yhdeksi komennoksi.

Kommentit

  • tarkista, mihin sinä suljet toisen kiharan hakasulun: '{ if ( this is given) { do this } else { do that } }'

Vastaa

Tässä on koodisi, joka on laajennettu näkyvyyden vuoksi:

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

Tässä on monia asioita, jotka tulevat mieleen

  1. Yrität käyttää tasa-arvon vertailua tehtävän sijasta ja lisää chr etuliite
  2. Olet lisännyt sulkeisiin tehtävän, jonka pitäisi olla
  3. On olemassa ylimääräinen } ensimmäisen
  4. Ennen else -osaa ei saa olla puolipistettä
  5. Sinulta puuttuu viimeinen sulku } koodin jälkeen

Tässä on kiinteä versio, joka on edelleen laajennettu:

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

Ja sitten voimme nähdä yksinkertaisen optimoinnin siirtää toistuva print $0 ehdosi ulkopuolelle:

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

Koska tämä on pohjimmiltaan yksinkertainen ”ehto → muutos”. Voit yksinkertaisesti käyttää awk ”vakiorakennetta yksinkertaistamaan tätä edelleen. Tässä meillä on kaksi lauseketta awk, jotka käsitellään peräkkäin jokaiselle syötetiedoston riville. Ensimmäisen rivin etuliitteet "chr" tarpeen mukaan. Toinen tulostaa kaikki rivit.

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

Koska tämä on awk, se voidaan jopa koota yhdeksi riviksi. , vaikka luettavuus kärsii hieman

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

vastaus

Tämän rivin käyttäminen näyttää olevan toimi täydellisesti:

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

kommentit

  • ($1 ~ /rs/ || /chr/) vastaa $1 haulle "rs", mutta $0 kohteelle "chr". Sinun tulisi joko ($1 ~ /rs/ || $1 ~ /chr/) tai ($1 ~ /rs|chr/)

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *