2016-11-27 10 views
6

Mam zestaw danych z 20 000 sond, są one w dwóch kolumnach po 21 sztuk każdy. Z tego pliku muszę wyodrębnić linie, w których ostatni nukleotyd w kolumnie Probe1 pasuje do ostatniego nukleotydu w kolumnie Probe 2. Do tej pory próbowałem funkcji AWK (substr), ale nie uzyskałem oczekiwanego rezultatu. Oto jeden-liner Próbowałem:Awk: jak porównać dwa ciągi w jednym wierszu

awk '{if (substr($2,21,1)==substr($4,21,1)){print $0}}' 

Innym rozwiązaniem byłoby zakotwiczyć ostatni znak w kolumnach 2 i 4 (awk '$2~/[A-Z]$/), ale nie mogę znaleźć sposób, aby dopasować sondy w dwóch kolumnach przy użyciu regex. Wszystkie sugestie i komentarze będą bardzo mile widziane.

Przykład zbioru danych:

 Probe 1      Probe 2 
4736 GGAGGAAGAGGAGGCGGAGGA A GGAGGACGAGGAGGAGGAGGA 
4737 GGAGGAAGAGGAGGGAGAGGG B GGAGGACGAGGAGGAGGAGGG 
4738 GGAGGATTTGGCCGGAGAGGC C GGAGGAGGAGGAGGACGAGGT 
4739 GGAGGAAGAGGAGGGGGAGGT D GGAGGACGAGGAGGAGGAGGC 
4740 GGAGGAAGAGGAGGGGGAGGC E GGAGGAGGAGGACGAGGAGGC 

Pożądany wyjściowa:

4736 GGAGGAAGAGGAGGCGGAGGA A GGAGGACGAGGAGGAGGAGGA 
4737 GGAGGAAGAGGAGGGAGAGGG B GGAGGACGAGGAGGAGGAGGG 
4740 GGAGGAAGAGGAGGGGGAGGC E GGAGGAGGAGGACGAGGAGGC 
+4

Podany przykład 'awk' już tworzy pożądane wyjście, które opisałeś. Czego więcej potrzebujesz? – janos

+0

To rzeczywiście działa, przepraszam za zamieszanie. – Bio21

Odpowiedz

5

To będzie filtrować wejście, dopasowując linie gdzie ostatni znak 2. kolumnie jest równa ostatniej charakteru 4 kolumna:

awk 'substr($2, length($2), 1) == substr($4, length($4), 1)' 

Co zmieniono w porównaniu do przykładowego skryptu:

  • Przesuń oświadczenie if z bloku { ... } w filtrze
  • Korzystanie length($2) i length($4) zamiast sztywno wartości 21
  • { print $0 } nie jest potrzebne, ponieważ jest to domyślna akcja dla dopasowanej linii