2013-08-06 4 views
0

J'écris un script awk qui analyse un fichier CSV, compare une colonne contenant la date et une autre colonne contenant le type d'activité, puis imprime le compte d'une activité particulière.incrément variable dans awk basé sur deux colonnes

Le code que je l'ai écrit est:

NOW=$(date --date="5 days ago" +"%Y%m%d") 
awk -F "," -v mydate=$NOW '{ 
    var_1=1; 
    var_2=1;} { 
    if (substr($8,2,8) == mydate) { 
       if ($6 == 1001) { 
        var_1++; 
       } 
       else if ($6 == 1003) { 
        var_2++; 
       } 
    } 
    print var_1 var_2 
}' *.csv 

La sortie que je reçois est

11 
11 
11 
11 
11 
11 

Je crois que la question est quelque chose à voir avec la façon dont je l'ai défini var_1 et var_2; ils sont réinitialisés ou quelque chose.

Je veux également imprimer uniquement la valeur finale de var_1 et var_2; pour le moment, il est imprimé à chaque itération de awk.

Un conseil?

Répondre

1

Vous avez deux blocs qui sont exécutées sur chaque ligne de données:

  1. { var_1=1; var_2=1; } qui définit les variables de 1 à chaque passage.
  2. { if (substr($8,2,8) == mydate) { if ($6 == 1001) { var_1++; } else if ($6 == 1003) { var_2++; } } print var_1 var_2 } qui imprime les valeurs de var_1 et var_2 comme chaînes concaténées (donc pas d'espace entre les 1 et 1).

Il semble que ce soit la condition substr() ou la condition $6 ne sont pas dans l'appariement, jamais.

Vous vouliez probablement BEGIN avant le premier bloc, mais pourquoi commencer à 1 plutôt que 0 n'est pas évident. Si vous avez commencé les comptages à 0, vous n'auriez pas besoin d'un bloc BEGIN. Vous devriez probablement utiliser print var_1, var_2 pour séparer les deux valeurs.

Quant à savoir pourquoi les matches ne sont pas assorties, il n'y a aucun moyen de dire sans données d'échantillon à travailler, mais vous pouvez déboguer en imprimant $8 et $6 pour chaque ligne (et mydate, aussi, et peut-être substr($8,2,8)) , donc vous pouvez voir ce qui se passe.

Si vous ne souhaitez que les valeurs à imprimer à la fin, puis (une fois que vous avez débogués ce qui se passe pendant l'action principale), vous pouvez placer le print dans un bloc END:

END { print var_1, var_2 } 
+0

grâce, BEGIN , FIN est ce que je cherchais. les conditions correspondent bien. – kasai

Questions connexes