awk błąd instrukcji if-then-else

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

  • sprawdź, gdzie zamykasz drugi nawias klamrowy: '{ if ( this is given) { do this } else { do that } }'

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

  1. Używasz porównania równości zamiast przypisania, aby spróbować i dodaj przedrostek chr
  2. W nawiasach umieściłeś to, co powinno być przypisaniem. „>

po pierwszym

  • Nie powinno być średnika przed else częścią
  • Brakuje ostatniego zamknięcia } 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/)

    Dodaj komentarz

    Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *