web-dev-qa-db-fra.com

Vérifier la longueur du champ à l'aide de awk

J'ai un fichier de 3 champs:

123710337783,351898014413150,123028040249634
123710337785,352934028758390,123028040109275

Je dois vérifier que les champs correspondent aux longueurs suivantes:

Field 1 = 12
Field 2 = 15 or 16
Field 3 = 15

Je reçois une erreur lors de l'exécution de ceci:

awk -F, '{if(length($2) == 15 ) || length($2) == 16) && length($1) == 12 && length($3)) == 15) print  }'

Veuillez aider.

Bernie

22
bernie

Tous vos supports ne correspondent pas. Une expression `` si '' doit être contenue entre crochets, c'est-à-dire,

if (X == 45) ...
if ((X == 45) || (Y == 23)) ...

vous ne l'avez pas, et vous avez plus de parenthèses fermantes que de parenthèses ouvrantes - ainsi l'équilibre est également éteint; si nous comptons les parenthèses (incrémenter pour ouvrir, décrémenter pour fermer), nous nous retrouvons avec un total de -3 au lieu de 0, fermant ainsi trois parenthèses de plus que nous avons ouvert:

            1      2  1       0          1  0     -1          0 -1                0 -1 -2     -3
awk -F, '{if(length($2) == 15 ) || length($2) == 16) && length($1) == 12 && length($3)  ) == 15) print  }'

Alors, essayez plutôt cela qui rééquilibre tout:

awk -F, '{ if (((length($2) == 15 ) || length($2) == 16) && (length($1) == 12 && length($3) == 15)) print }'
18
Chris J

Si tout ce que vous allez faire est d'imprimer, mettez votre expression comme condition par défaut:

awk -F, 'length($1)==12 && (length($2)==15 || length($2)==16) && length($3)==15'

Si vous essayez de filtrer les lignes de votre fichier d'entrée qui ne répondent pas à ces critères:

awk -F, '
    length($1)!=12 || length($2)<15 || length($2)>16 || length($3)!=15) {next}
    # do other stuff...
'
8
glenn jackman

Vous avez des parenthèses asymétriques/déséquilibrées au conditionnel. Essayer:

{ if ((length($2) == 15 || length($2) == 16) && length($1) == 12 && length($3) == 15) print; }
5
David J. Liszewski