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$1
pro"rs"
, ale$0
pro"chr"
. Měli byste buď($1 ~ /rs/ || $1 ~ /chr/)
nebo($1 ~ /rs|chr/)
'{ if ( this is given) { do this } else { do that } }'