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
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
- A kiosztás helyett egyenlőség-összehasonlítást használ, hogy megpróbálja és add hozzá az
chr
előtagot - Zárójelbe tetted azt, ami legyen egy hozzárendelés
- Van egy idegen
}
az első - A
else
rész előtt nem lehet pontosvessző. - 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/)
'{ if ( this is given) { do this } else { do that } }'