Utilisation de Awk pour extraire des lignes d'un fichier où 3 $ - 2 $ sont compris entre 200 et 400.
Commande que j'utilise:
B 1000 1300 D 1000 1200
Message d'erreur:
A 1000 1500 B 1000 1300 C 1000 1100 D 1000 1200
La commande fonctionne si j'utilise un seul paramètre, par exemple awk '{ if ($3 - $2 > 199) print $0}' Input_File
, mais pas lorsque j'utilise &&
. Comment puis-je réparer ça?
Exemple Input_File:
awk: syntax error at source line 1 context is { if ($3 - $2 > 199 && >>> < <<< 401) print $0} awk: illegal statement at source line 1
Exemple de sortie souhaitée:
awk '{ if ($3 - $2 > 199 && < 401) print $0}' Input_File
3 Réponses :
Vous pouvez créer une variable avec la différence des 3ème et 2ème colonnes, puis l'utiliser dans des conditions.
awk '{ val=($3 - $2);if ( val > 199 && val < 401) print $0}' Input_File
Pourquoi la tentative d'OP obtient une erreur: OP utilise if ($3 - $2 > 199 && < 401)
qui est erroné en raison de la différence entre la 3e et la 2e colonne n'est PAS mentionné 2 fois (après &&
, avant < 401
) pour chaque condition (soit séparé par condition OU / ET) doit être mentionné séparément. il devrait donc être comme: if (($3 - $2 > 199) && ($3 - $2 < 401))
. IMHO faisant une variable sera préférable d'éviter d'obtenir des différences 2 fois, d'obtenir une différence une fois dans une variable et de l'utiliser dans des conditions différentes.
Votre état après &&
est incomplet. Vous pouvez simplement utiliser:
awk '$3-$2 > 199 && $3-$2 < 401' file B 1000 1300 D 1000 1200
si vous ne voulez pas répéter le calcul, vous pouvez le faire à la place
$ awk '(d=$3-$2)>199 && d<401' file
Dans quel langage de programmation
x - y > 199 && < 401
serait-il une syntaxe valide? La syntaxe Awk est très similaire à celle de tout autre langage de base Algol (C, Pascal, Ada, etc., etc.) alors réfléchissez simplement à la façon d'écrire ce que vous voulez exprimer dans cette instructionif
dans la langue que vous connaissez. avec, puis utilisez la même syntaxe dans awk et ce sera presque certainement correct.