Supongamos que tengo un archivo similar al siguiente:
123
123
234
234
123
345
Me gustaría saber cuántas veces se ha duplicado '123', cuántas veces se ha duplicado '234', etc. Así que, idealmente, el resultado sería:
123 3
234 2
345 1
Supongamos que tengo un archivo similar al siguiente:
123
123
234
234
123
345
Me gustaría saber cuántas veces se ha duplicado '123', cuántas veces se ha duplicado '234', etc. Así que, idealmente, el resultado sería:
123 3
234 2
345 1
Respuestas:
Suponiendo que haya un número por línea:
sort <file> | uniq -c
También puede usar el --count
indicador más detallado con la versión GNU, por ejemplo, en Linux:
sort <file> | uniq --count
sort
nuevamente como:sort <file> | uniq -c | sort -n
Esto imprimirá solo líneas duplicadas , con recuentos:
sort FILE | uniq -cd
o, con las opciones largas de GNU (en Linux):
sort FILE | uniq --count --repeated
en BSD y OSX debe usar grep para filtrar líneas únicas:
sort FILE | uniq -c | grep -v '^ *1 '
Para el ejemplo dado, el resultado sería:
3 123
2 234
Si desea imprimir recuentos para todas las líneas, incluidas las que aparecen solo una vez:
sort FILE | uniq -c
o, con las opciones largas de GNU (en Linux):
sort FILE | uniq --count
Para la entrada dada, la salida es:
3 123
2 234
1 345
Para ordenar la salida con las líneas más frecuentes en la parte superior, puede hacer lo siguiente (para obtener todos los resultados):
sort FILE | uniq -c | sort -nr
o, para obtener solo líneas duplicadas, las más frecuentes primero:
sort FILE | uniq -cd | sort -nr
en OSX y BSD el último se convierte en:
sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
| sort -n
o | sort -nr
a la tubería ordenará la salida por recuento de repeticiones (ascendente o descendente, respectivamente). Esto no es lo que estás preguntando, pero pensé que podría ayudar.
| awk '$1>100'
sort FILE | uniq -c | grep -v '^ *1 '
Vía awk:
awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data
En awk 'dups[$1]++'
comando, la variable $1
contiene todo el contenido de la columna 1 y los corchetes son acceso a la matriz. Entonces, para cada 1ra columna de línea en el data
archivo, el nodo de la matriz nombrada dups
se incrementa.
Y al final, estamos recorriendo una dups
matriz con una num
variable e imprimimos primero los números guardados y luego su número de valores duplicados dups[num]
.
Tenga en cuenta que su archivo de entrada tiene espacios al final de algunas líneas, si las borra, puede usarlas $0
en lugar del $1
comando anterior :)
uniq
?
sort | uniq
y la solución awk tiene compensaciones de rendimiento y recursos bastante diferentes: si los archivos son grandes y el número de líneas diferentes es pequeño, la solución awk es mucho más eficiente. Es lineal en el número de líneas y el uso del espacio es lineal en el número de líneas diferentes. OTOH, la solución awk necesita mantener todas las diferentes líneas en la memoria, mientras que la clasificación (GNU) puede recurrir a archivos temporales.
En Windows usando "Windows PowerShell" usé el comando mencionado a continuación para lograr esto
Get-Content .\file.txt | Group-Object | Select Name, Count
También podemos usar el cmdlet where-object para filtrar el resultado
Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count
Suponiendo que tiene acceso a un entorno estándar de shell y / o cygwin de Unix:
tr -s ' ' '\n' < yourfile | sort | uniq -d -c
^--space char
Básicamente: convierta todos los caracteres de espacio en saltos de línea, luego ordene la salida traducida y aliméntela a uniq y cuente las líneas duplicadas.