Tengo un file.log
archivo con datos que pueden ocurrir o no más de una vez.
a
b
c
a
d
b
a
a
a
a
b
z
d
e
f
e
Actualmente estoy usando sort file.log | uniq -c | sort -rn | head -n 10
para ordenarlos por la cantidad de duplicados encontrados en el archivo, pero obtengo las 10 apariciones principales. Entonces, por ejemplo, si un carácter reaparece 5 veces en el archivo, dice 5
y el carácter que le corresponde.
¿Cómo puedo generar las líneas para obtener los caracteres con más de un cierto número de apariciones/duplicados encontrados en el archivo? Por ejemplo, para obtener sólo los caracteres que aparecen más de 10 veces. Y preferiblemente una forma de definir cuántos de esos caracteres generar, por ejemplo, solo 5 resultados de caracteres que tengan 10 o más duplicados.
Respuesta1
Usando la entrada proporcionada, si desea encontrar qué caracteres aparecen mayores o iguales a tres veces: mantenga un conteo y genere la línea la tercera vez que se vea.
$ awk '++count[$0] == 3' file
a
b
Canalice eso para head
limitar la salida. Claramente, esto no ordena por número de ocurrencias. Para hacer eso, usando GNU awk:
gawk -v limit=3 '
{ ++count[$0] }
END {
PROCINFO["sorted_in"] = "@val_num_desc"
n = 0
for (line in count) {
if (n == limit) break
print count[line], line
++n
}
}
' file
salidas
6 a
3 b
2 d
Árbitrohttps://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html
Respuesta2
Podrías usar el inicio de tu canalización original y luego awk
filtrar esos resultados:
sort file.log | uniq -c | sort -rn | awk '$1 >= 10' | head -n 5
Al awk
final imprime solo aquellas líneas que corresponden a recuentos mayores o iguales a 10. Al head
finalmuyend limita el resultado global a un máximo de cinco líneas.
Sin embargo , puedes hacer un poco más awk
:
awk '{ c[$0]++ } END { for (w in c) if (c[w] >= 10) print c[w], w }' file.log |
sort -nr | head -n 5
Esto cuenta y elimina las líneas de conteo bajo primero awk
, luego le brinda los cinco resultados principales con sort
y head
.
El conteo se realiza incrementando un elemento en una matriz asociativa c
, donde la línea de entrada actual se usa como clave.
El END
bloque (que se activa después de leer la última línea de file.log
), itera sobre todas las claves en c
, y si la clave corresponde a un recuento mayor o igual a 10, el recuento se imprime junto con la línea que tiene ese recuento.
Respuesta3
sort file.log | uniq -c | sort -rn | awk '{if($1 >= 10 && $1 <= 20){{print $1, $2}}}'