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
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
- Yrität käyttää tasa-arvon vertailua tehtävän sijasta ja lisää
chretuliite - Olet lisännyt sulkeisiin tehtävän, jonka pitäisi olla
- On olemassa ylimääräinen
}ensimmäisen - Ennen
else-osaa ei saa olla puolipistettä - 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$1haulle"rs", mutta$0kohteelle"chr". Sinun tulisi joko($1 ~ /rs/ || $1 ~ /chr/)tai($1 ~ /rs|chr/)
'{ if ( this is given) { do this } else { do that } }'