Ik schrijf een if-then-else statement met awk in een bash-script.
Wat ik zou willen doen, is regels identificeren met col 1-waarden die niet overeenkomen met een bepaalde string (rs of chr) en een voorvoegsel (chr) toevoegen aan de col 1-waarden voor die geïdentificeerde regels. Alle regels met de overeenkomende string zouden moeten worden afgedrukt zoals ze waren – geen toevoeging.
Mijn regel code tot dusver is:
awk "{if (! ($1 ~ /rs/ || $1 ~ /chr/)) {($1 == "chr"$1); print $0}}; else {print $0}" filename > newfilename
I blijf syntaxisfoutmeldingen ontvangen met deze code.
Ik kan de identificatie en het toevoegen met succes alleen uitvoeren, maar ik heb problemen om ze te combineren in één commando.
Opmerkingen
Antwoord
Hier is je code, uitgebreid voor zichtbaarheid:
awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { ($1 == "chr"$1); print $0} }; else { print $0 } " filename > newfilename
Er zijn hier een aantal problemen die in je opkomen
- Je gebruikt een gelijkheidsvergelijking in plaats van een opdracht om te proberen en voeg het
chr
voorvoegsel - Je hebt wat een opdracht zou moeten zijn tussen haakjes gezet
- Er is een overbodige
}
na de eerste - Er mag geen puntkomma voor het
else
-gedeelte staan - Je mist de laatste afsluiting
}
na de code
Hier is een vaste versie, nog steeds uitgebreid:
awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1; print $0 } else { print $0 } } " filename > newfilename
En dan zien we een eenvoudige optimalisatie om de herhaalde print $0
buiten uw conditie te verplaatsen:
awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 } print $0 } " filename > newfilename
Sinds dit is in feite een simpele “voorwaarde → wijziging”. U kunt de standaard structuur van awk
“gebruiken om dit verder te vereenvoudigen. Hier hebben we twee awk
-instructies, opeenvolgend verwerkt voor elke regel van uw invoerbestand. De eerste regel voegt waar nodig "chr"
toe. De tweede drukt elke regel af.
awk " (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 } 1 " filename > newfilename
Aangezien dit awk
is, kan het zelfs tot een enkele regel worden opgerold , hoewel de leesbaarheid er een beetje onder lijdt
awk "(! ($1 ~ /rs|chr/) ) { $1 = "chr" $1 } 1" filename > newfilename
Antwoord
Het gebruik van deze regel lijkt werken perfect:
awk "!($1 ~ /rs/ || /chr/) {$1="chr"$1}1"
Reacties
-
($1 ~ /rs/ || /chr/)
komt overeen met$1
voor"rs"
, maar$0
voor"chr"
. U moet ofwel($1 ~ /rs/ || $1 ~ /chr/)
of($1 ~ /rs|chr/)
'{ if ( this is given) { do this } else { do that } }'