Une question de base à propos de l'opérateur logique AND. J'essaie d'extraire certains champs de mon fichier de données niveles.csv en fonction des valeurs des colonnes 1 et 2. J'aimerais écrire une phrase awk disant "lorsque champ1 = date et champ2 = zone, affiche les champs 3 à 5" .
Mon fichier de données ressemble à
01-08-12;1;0;0;0
01-08-12;2;1;1;1
01-08-12;3;0;0;1
................
phrase awk à l'intérieur d'un script bash est
date=01-08-2012
area=8
awk 'BEGIN {FS=";"} $1 ~ /'$date'/ && $2 ~ /'$area'/ { print $1 " " $2 " " $3 " " $4 " " $5 }' niveles-rams.cs
Mais cela ne donne que des champs pour les trois cas où le numéro de zone a un 8 intérieur (8,18 et 28) alors que je ne veux que des données de zone 8
01-08-2012 8 0 0 0
01-08-2012 18 2 2 1
01-08-2012 28 2 1 0
Merci d’avance de votre attention, c’est une question simple pour les utilisateurs expérimentés.
Pas testé:
awk 'BEGIN {FS=";"} $1 ~ /'$date'/ && $2 == '$area'{......}'
$ 2 ~/8/-> cela signifie que si le deuxième champ contient 8
$ 2 == 8 -> cela signifie que si le deuxième champ est égal à 8
Utilisez l'option -v
de awk pour créer des variables awk contenant les variables du shell.
awk -v date="$date" -v area="$area" '$1 == date && $2 == area { ... }'
Étant donné que cette question suscite beaucoup d’attention en raison de son titre, laissez-moi vous donner une réponse plus générique expliquant comment utiliser l’opérateur AND
dans awk
.
Disons que vous avez un fichier myfile
:
a 1 2 3
b 4 5 6
c 7 8 9
Si vous cherchez un moyen d'effectuer plusieurs vérifications à l'aide de l'opérateur AND
, vous devez utiliser &&
comme ceci:
awk '$2 < 10 && $3 > 2' myfile
Ce qui reviendrait:
b 4 5 6
c 7 8 9
En général, vous pouvez utiliser autant de conditions que vous le souhaitez, en tenant compte du fait que
AND --> &&
OR --> ||
Ainsi, vous pouvez combiner plusieurs expressions logiques, comme par exemple:
awk '($2 < 10 || $3 > 2) && ($2 > 10 || $3 < 2)' myfile
# ^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^
Cela devrait aller, j'ai fait un petit test:
date="01-08-12"
area=8
awk -F\; '$1 == "'$date'" && $2 == '$area' { print $3 " " $4 " " $5 }' niveles-rams.csv
Si vous voulez y inclure les champs date et zone, alors l'instruction awk ressemble à ceci:
awk -F\; '$1 == "'$date'" && $2 == '$area' { print $1 " " $2 " " $3 " " $4 " " $5 }' niveles-rams.csv