web-dev-qa-db-fra.com

Awk ET opérateur

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.

14
pacomet

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

12
Guru

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 { ... }'
10
Barmar

É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
#    ^^^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^
8
fedorqui

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
0
pedrevans