chyba příkazu awk if-then-else

Píšu příkaz if-then-else pomocí awk ve skriptu bash.

To, co bych chtěl udělat, je identifikovat řádky s hodnotami col 1, které neodpovídají konkrétnímu řetězci (rs nebo chr) a připojit předponu (chr) k hodnotám col 1 pro tyto identifikované řádky. Všechny řádky se shodným řetězcem by se měly tisknout tak, jak byly – bez připojování.

Můj řádek kódu zatím je:

awk "{if (! ($1 ~ /rs/ || $1 ~ /chr/)) {($1 == "chr"$1); print $0}}; else {print $0}" filename > newfilename 

I i nadále s tímto kódem přijímat chybové zprávy o syntaxi.

Identifikaci a připojení mohu úspěšně provést samostatně, ale mám problémy s jejich kombinací do jednoho příkazu.

Komentáře

  • zkontrolujte, kde zavřete druhou složenou závorku: '{ if ( this is given) { do this } else { do that } }'

odpověď

Zde je váš kód rozšířený o viditelnost:

awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { ($1 == "chr"$1); print $0} }; else { print $0 } " filename > newfilename 

Existuje řada problémů, které se vám vybaví.

  1. Místo přiřazení k vyzkoušení používáte srovnání rovnosti a přidejte předponu chr
  2. Do závorek jste vložili to, co by mělo být přiřazení
  3. Existuje po prvním
  4. Před else částí
  5. Chybí vám poslední zavírací
    středník id = „277b6c383d“>

    po kódu

Zde je pevná verze, stále rozšířená:

awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1; print $0 } else { print $0 } } " filename > newfilename 

A pak vidíme jednoduchou optimalizaci pro přesun opakovaného print $0 mimo váš stav:

awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 } print $0 } " filename > newfilename 

Protože jedná se v zásadě o jednoduchou „podmínku → pozměnit“, k jejímu dalšímu zjednodušení můžete skutečně použít standardní strukturu awk. Zde máme dva awk příkazy zpracované postupně pro každý řádek vašeho vstupního souboru. Předpony prvního řádku podle potřeby "chr". Druhý vytiskne každý řádek.

awk " (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 } 1 " filename > newfilename 

Protože se jedná o awk, lze jej dokonce srolovat do jednoho řádku , ačkoli čitelnost trochu trpí

awk "(! ($1 ~ /rs|chr/) ) { $1 = "chr" $1 } 1" filename > newfilename 

Odpověď

Zdá se, že použití tohoto řádku fungují perfektně:

awk "!($1 ~ /rs/ || /chr/) {$1="chr"$1}1" 

Komentáře

  • ($1 ~ /rs/ || /chr/) bude odpovídat $1 pro "rs", ale $0 pro "chr". Měli byste buď ($1 ~ /rs/ || $1 ~ /chr/) nebo ($1 ~ /rs|chr/)

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *