awk if-then-else statement error

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

  • controleer waar je die tweede accolade sluit: '{ if ( this is given) { do this } else { do that } }'

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

  1. Je gebruikt een gelijkheidsvergelijking in plaats van een opdracht om te proberen en voeg het chr voorvoegsel
  2. Je hebt wat een opdracht zou moeten zijn tussen haakjes gezet
  3. Er is een overbodige } na de eerste
  4. Er mag geen puntkomma voor het else -gedeelte staan
  5. 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/)

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *