2016-12-29 2 views
0

je tentais d'obtenir le nombre total de « ?? », « M », « A » et « D » de ceci:AWK comment compter les modèles sur la première colonne?

?? this is a sentence 
M this is another one 
A more text here 
D more and more text 

J'ai cette ligne exemple de code, mais ne fonctionne pas:

awk -v pattern="\?\?" '{$1 == pattern} END{print " "FNR}' 
+2

raisons pour vérifier votre titre avant de poster, # 1 – ArtOfCode

+0

La bonne solution est d'utiliser le format de sortie lisible par machine de Subversion et analyser cela. Cependant, le XML est assez complexe, donc vous trouverez beaucoup de solutions existantes similaires à ce que vous avez essayé ici. Avez-vous google du tout? – tripleee

Répondre

1
$ awk '{ print $1 }' file | sort | uniq -c 
1 ?? 
1 A 
1 D 
1 M 

Si pour une raison quelconque, vous voulez une solution awk seule:

awk '{ ++cnt[$1] } END { for (i in cnt) print cnt[i], i }' file 

mais je pense que CBH inutilement comparé à l'utilisation des outils Unix intégrés qui font déjà la plupart du travail.

Si vous voulez juste compter une valeur particulière:

awk -v value='??' '$1 == value' file | wc -l 

Si vous voulez compter un sous-ensemble de valeurs, vous pouvez utiliser une expression régulière:

$ awk -v pattern='A|D|(\\?\\?)' '$1 ~ pattern { print $1 }' file | sort | uniq -c 
1 ?? 
1 A 
1 D 

Ici, vous avez besoin de envoyez un \ pour que les ? s fuient dans l'expression régulière. Et parce que le \ est lui-même un caractère spécial dans la chaîne qui est passée à awk, vous devez d'abord y échapper (d'où le double backslash).