2012-10-25 13 views
8

Una domanda di base sull'operatore AND logico. Sto cercando di estrarre alcuni campi nel mio file di dati niveles.csv in base ai valori delle colonne 1 e 2. Mi piacerebbe scrivere una frase awk che dice "quando field1 = date e field2 = area quindi stampa i campi da 3 a 5" .Awk AND operator

Il mio file di dati sembra

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

frase awk all'interno di uno script bash è

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

Ma questo dà solo i campi per i tre casi in cui il numero zona ha un 8 interno (8,18 e 28) mentre desidero solo i dati dell'area 8

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

Grazie in anticipo per la vostra attenzione , certo è una domanda semplice per utenti esperti.

risposta

7

Non testato:

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

$ 2 ~/8/-> questo significa che se secondo campo contiene 8

$ 2 == 8 -> questo significa che se secondo campo è uguale a 8

+0

Grazie , Non ero a conoscenza della differenza tra ~ e == – pacomet

+3

No. NON farlo! Vedi http://cfajohnson.com/shell/cus-faq-2.html#Q24 per come accedere al valore delle variabili di shell forma uno script awk e vedi la risposta di @ Barmar qui. –

+0

@EdMorton: Sono d'accordo che questo non è il modo giusto per accedere alle variabili della shell ... la soluzione è fornita per far funzionare la soluzione dell'OP ... – Guru

9

Usa l'opzione -v di awk per creare variabili awk contenenti le variabili di shell.

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

Questo dovrebbe essere ok, ho dato un piccolo test:

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

Se si desidera che i campi della data e zona in là allora l'istruzione awk è simile al seguente:

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

Una soluzione molto bella, grazie – pacomet

+1

No. NON farlo! Vedi cfajohnson.com/shell/cus-faq-2.html#Q24 per come accedere al valore delle variabili di shell forma uno script awk e vedi la risposta di @ Barmar qui. –

5

Dato che questa domanda sta ricevendo molta attenzione a causa del titolo, lasciatemi pubblicare una risposta più generica su come utilizzare l'operatore AND in awk.

Diciamo che avete un file di myfile:

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

Se siete alla ricerca di un modo per fare un po 'più controlli utilizzando l'operatore AND, è necessario utilizzare && come questo:

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

Quale restituirebbe:

b 4 5 6 
c 7 8 9 

In generale, è possibile utilizzare come molte condizioni che vuoi, tenendo conto che

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

in modo da poter combinare più espressioni logiche, come ad esempio:

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