awk if-then-else utasítás hiba

If-then-else utasítást írok az awk használatával egy bash szkriptben.

Azt szeretném megtenni, hogy azonosítsam azokat a sorokat, amelyek col 1 értékei nem felelnek meg egy adott karakterláncnak (rs vagy chr), és egy előtagot (chr) fűzök az azonosított sorok col 1 értékeihez. Az illesztett karakterlánccal rendelkező összes sort úgy kell kinyomtatni, ahogy voltak – nincs hozzáfűzve.

Eddig a kódsorom:

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

I továbbra is kapjon szintaxis hibaüzeneteket ezzel a kóddal.

Az azonosítást és a hozzáfűzést egyedül is elvégezhetem, de problémáim vannak egyetlen parancsba egyesíteni őket.

Megjegyzések

  • ellenőrizze, hogy hol zárja be azt a második göndör zárójelet: '{ if ( this is given) { do this } else { do that } }'

Válasz

Itt van a kód, kibővítve a láthatóság érdekében:

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

Számos kérdés merül fel ebben, ami eszembe jut

  1. A kiosztás helyett egyenlőség-összehasonlítást használ, hogy megpróbálja és add hozzá az chr előtagot
  2. Zárójelbe tetted azt, ami legyen egy hozzárendelés
  3. Van egy idegen } az első
  4. A else rész előtt nem lehet pontosvessző.
  5. Hiányzik a végső záró } a kód után

Itt van egy fix verzió, még mindig kibővítve:

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

És akkor láthatunk egy egyszerű optimalizálást az ismételt print $0 állapot áthelyezésére az Ön állapotán kívülre:

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

Mivel ez alapvetően egy egyszerű “feltétel → módosítás”, valójában a awk “szabványos szerkezetét használhatja ennek további egyszerűsítésére. Itt van két awk utasítás, amelyeket egymás után feldolgozunk a bemeneti fájl minden sorára. Az első sor előtagok "chr", ha szükséges. A második minden sort kinyomtat.

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

Mivel ez awk, akár egyetlen sorba is feltekerhető. , bár az olvashatóság kissé szenved

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

Válasz

Úgy tűnik, hogy ennek a sornak a használata tökéletesen működik:

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

megjegyzések

  • ($1 ~ /rs/ || /chr/) $1 a "rs", de $0 a "chr". Vagy ($1 ~ /rs/ || $1 ~ /chr/), vagy ($1 ~ /rs|chr/)

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük