Piszę instrukcję if-then-else, używając awk w skrypcie bash.
To, co chciałbym zrobić, to zidentyfikować linie z wartościami col 1, które nie pasują do określonego ciągu (rs lub chr) i dołączyć przedrostek (chr) do wartości col 1 dla tych zidentyfikowanych linii. Wszystkie wiersze z dopasowanym ciągiem powinny zostać wydrukowane tak, jak były – bez dołączania.
Mój dotychczasowy wiersz kodu to:
awk "{if (! ($1 ~ /rs/ || $1 ~ /chr/)) {($1 == "chr"$1); print $0}}; else {print $0}" filename > newfilename
I nadal otrzymuj komunikaty o błędach składni z tym kodem.
Mogę samodzielnie przeprowadzić identyfikację i dołączenie, ale mam problemy z połączeniem ich w jedno polecenie.
Komentarze
Odpowiedź
Oto Twój kod, rozszerzony w celu zwiększenia widoczności:
awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { ($1 == "chr"$1); print $0} }; else { print $0 } " filename > newfilename
Jest wiele problemów z tym przychodzących na myśl
- Używasz porównania równości zamiast przypisania, aby spróbować i dodaj przedrostek
chr
- W nawiasach umieściłeś to, co powinno być przypisaniem. „>
po pierwszym
else
częścią }
po kodzie Oto poprawiona wersja, wciąż rozwinięta:
awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1; print $0 } else { print $0 } } " filename > newfilename
Następnie możemy zobaczyć prostą optymalizację, aby przesunąć powtarzające się print $0
poza twój stan:
awk " { if (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 } print $0 } " filename > newfilename
Ponieważ jest to w zasadzie prosty „warunek → popraw”, możesz w rzeczywistości użyć standardowej struktury awk
, aby jeszcze bardziej to uprościć. Mamy tutaj dwie instrukcje awk
, przetwarzane sekwencyjnie dla każdego wiersza pliku wejściowego. W razie potrzeby przedrostki pierwszego wiersza "chr"
. Druga wypisuje każdy wiersz.
awk " (! ($1 ~ /rs/ || $1 ~ /chr/) ) { $1 = "chr" $1 } 1 " filename > newfilename
Ponieważ jest to awk
, można go nawet zwinąć w jeden wiersz chociaż czytelność trochę się zmniejsza
awk "(! ($1 ~ /rs|chr/) ) { $1 = "chr" $1 } 1" filename > newfilename
Odpowiedź
Wydaje się, że użycie tego wiersza działa idealnie:
awk "!($1 ~ /rs/ || /chr/) {$1="chr"$1}1"
Komentarze
-
($1 ~ /rs/ || /chr/)
będzie pasować do$1
dla"rs"
, ale$0
dla"chr"
. Należy albo($1 ~ /rs/ || $1 ~ /chr/)
, albo($1 ~ /rs|chr/)
'{ if ( this is given) { do this } else { do that } }'