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ää
chr
etuliite - 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$1
haulle"rs"
, mutta$0
kohteelle"chr"
. Sinun tulisi joko($1 ~ /rs/ || $1 ~ /chr/)
tai($1 ~ /rs|chr/)
'{ if ( this is given) { do this } else { do that } }'