bash - help - Contar el número de apariciones de token en un archivo
man grep español (6)
En caso de que desee la salida en el formato que originalmente especificó (con el número de ocurrencias al final):
uniq -c logfile | sed ''s//([0-9]+/)/(.*/)//2: /1/''
Tengo un registro de acceso del servidor, con marcas de tiempo de cada solicitud http, me gustaría obtener un recuento del número de solicitudes en cada segundo. Utilizando sed
y cut -c
, hasta ahora he logrado cortar el archivo solo a las marcas de tiempo, como:
22-sep-2008 20:00:21 +0000
22-sep-2008 20:00:22 +0000
22-sep-2008 20:00:22 +0000
22-sep-2008 20:00:22 +0000
22-sep-2008 20:00:24 +0000
22-sep-2008 20:00:24 +0000
Lo que me gustaría obtener es la cantidad de veces que aparece cada marca de tiempo única en el archivo. Por ejemplo, con el ejemplo anterior, me gustaría obtener una salida que se vea así:
22-sep-2008 20:00:21 +0000: 1
22-sep-2008 20:00:22 +0000: 3
22-sep-2008 20:00:24 +0000: 2
He usado sort -u
para filtrar la lista de sellos de tiempo a una lista de tokens únicos, con la esperanza de poder usar grep como
grep -c -f <file containing patterns> <file>
pero esto solo produce una línea única de un gran total de líneas coincidentes.
Sé que esto se puede hacer en una sola línea, combinando algunas utilidades ... pero no puedo pensar en cuál. ¿Nadie sabe?
Usar AWK con matrices asociativas podría ser otra solución para algo como esto.
tal vez usar xargs? No puedo poner todo junto en mi cabeza en el lugar aquí, pero use xargs en su orden -u para que, por cada segundo único, pueda grep el archivo original y hacer wc -l para obtener el número.
Usando awk :
cat file.txt | awk ''{count[$1 " " $2]++;} /
END {for(w in count){print w ": " count[w]};}''
Creo que estás buscando
uniq --count
-c, --contecta líneas de prefijo por el número de ocurrencias
La solución de Tom:
awk ''{count[$1 " " $2]++;} END {for(w in count){print w ": " count[w]};}'' file.txt
funciona de manera más general.
Mi archivo no fue ordenado:
name1
name2
name3
name2
name2
name3
name1
Por lo tanto, las ocurrencias no se seguían entre sí, y uniq
no funciona como da:
1 name1
1 name2
1 name3
2 name2
1 name3
1 name1
Sin embargo, con el script awk:
name1:2
name2:3
name3:2