1
votes

Awk: extraire des lignes lorsque les colonnes sont totalisées dans une plage

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

awk

1 commentaires

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 instruction if dans la langue que vous connaissez. avec, puis utilisez la même syntaxe dans awk et ce sera presque certainement correct.


3 Réponses :


2
votes

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.


0 commentaires

4
votes

Votre état après && est incomplet. Vous pouvez simplement utiliser:

awk '$3-$2 > 199 && $3-$2 < 401' file

B    1000    1300
D    1000    1200


0 commentaires

2
votes

si vous ne voulez pas répéter le calcul, vous pouvez le faire à la place

$ awk '(d=$3-$2)>199 && d<401' file


0 commentaires