2012-10-25 6 views
8

Podstawowe pytanie o operator logiczny AND. Próbuję wyodrębnić niektóre pola w moim pliku danych niveles.csv na podstawie wartości kolumn 1 i 2. Chciałbym napisać zdanie awk mówiąc "kiedy pole1 = data i pole2 = obszar, a następnie wydrukuj pola od 3 do 5" .Awk AND operator

Mój plik danych wygląda

01-08-12;1;0;0;0 
01-08-12;2;1;1;1 
01-08-12;3;0;0;1 
................ 

awk zdanie wewnątrz skryptu bash jest

date=01-08-2012 
area=8 
awk 'BEGIN {FS=";"} $1 ~ /'$date'/ && $2 ~ /'$area'/ { print $1 " " $2 " " $3 " " $4 " " $5 }' niveles-rams.cs 

Ale to właśnie daje pola do trzech przypadków, w których liczba obszar o powierzchni 8 wewnątrz (8,18 i 28), a ja chcę tylko dane z obszaru 8:

01-08-2012 8 0 0 0 
01-08-2012 18 2 2 1 
01-08-2012 28 2 1 0 

Z góry dziękuję za uwagę , z pewnością jest to proste pytanie dla doświadczonych użytkowników.

Odpowiedz

7

nie testowano:

awk 'BEGIN {FS=";"} $1 ~ /'$date'/ && $2 == '$area'{......}' 

$ 2 ~/8/-> oznacza to, jeśli 2-cia pole zawiera 8

$ 2 == 8 -> oznacza to, jeśli 2-te pole jest równa 8

+0

Dzięki , Nie zdawałem sobie sprawy z różnicy między ~ i == – pacomet

+3

Nie. NIE rób tego! Zobacz http://cfajohnson.com/shell/cus-faq-2.html#Q24, aby uzyskać dostęp do wartości zmiennych powłoki z skryptu awk i zobacz odpowiedź @ Barmar tutaj. –

+0

@EdMorton: Zgadzam się, że to nie jest właściwy sposób dostępu do zmiennych powłoki ... rozwiązanie jest dostarczane, aby rozwiązanie OP działało ... – Guru

9

Użyj opcji awk do utworzenia zmiennych awk zawierających zmienne powłoki.

awk -v date="$date" -v area="$area" '$1 == date && $2 == area { ... }' 
0

To powinno być ok, dałem mu mały test:

date="01-08-12" 
area=8 
awk -F\; '$1 == "'$date'" && $2 == '$area' { print $3 " " $4 " " $5 }' niveles-rams.csv 

Jeśli chcesz daty i powierzchnia pól tam wówczas oświadczenie awk wygląda tak:

awk -F\; '$1 == "'$date'" && $2 == '$area' { print $1 " " $2 " " $3 " " $4 " " $5 }' niveles-rams.csv 
+0

Bardzo ładne rozwiązanie, dziękuję – pacomet

+1

Nie. NIE rób tego! Zobacz cfajohnson.com/shell/cus-faq-2.html#Q24, aby dowiedzieć się, jak uzyskać dostęp do wartości zmiennych powłoki, tworząc skrypt awk i zobacz tutaj odpowiedź @ Barmara. –

5

Ponieważ to pytanie jest bardzo ważne ze względu na tytuł, proszę pozwolić mi zamieścić bardziej ogólną odpowiedź na temat korzystania z operatora AND w awk.

Say masz plik myfile:

a 1 2 3 
b 4 5 6 
c 7 8 9 

Jeśli szukasz sposobu, aby zrobić kilka wielokrotne kontrole za pomocą operatora AND, trzeba użyć && tak:

awk '$2 < 10 && $3 > 2' myfile 

Które zwrócą:

b 4 5 6 
c 7 8 9 

Ogólnie, można użyć tyle warunków ile chcesz, biorąc pod uwagę, że

AND --> && 
OR --> || 

Więc można połączyć wiele wyrażeń logicznych takich jak na przykład:

awk '($2 < 10 || $3 > 2) && ($2 > 10 || $3 < 2)' myfile 
# ^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^