Ordenar archivo por duplicados si es mayor que un número determinado

Ordenar archivo por duplicados si es mayor que un número determinado

Tengo un file.logarchivo 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 10para 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 5y 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 headlimitar 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 awkfiltrar esos resultados:

sort file.log | uniq -c | sort -rn | awk '$1 >= 10' | head -n 5

Al awkfinal imprime solo aquellas líneas que corresponden a recuentos mayores o iguales a 10. Al headfinalmuyend 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 sorty 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 ENDbloque (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}}}'

información relacionada