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
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í.
- Místo přiřazení k vyzkoušení používáte srovnání rovnosti a přidejte předponu
chr - Do závorek jste vložili to, co by mělo být přiřazení
- Existuje po prvním
- Před
elsečástí - 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$1pro"rs", ale$0pro"chr". Měli byste buď($1 ~ /rs/ || $1 ~ /chr/)nebo($1 ~ /rs|chr/)
'{ if ( this is given) { do this } else { do that } }'