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
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å
- 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 - Du har lagt vad som ska vara en uppgift inom parentes
- Det finns en extern
}
efter den första - Det borde inte finnas något semikolon innan
else
delen - 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/)
'{ if ( this is given) { do this } else { do that } }'