Encontrar líneas duplicadas en un archivo y contar cuántas veces se duplicó cada línea?

Supongamos que tengo un archivo similar al siguiente:

123 123 234 234 123 345 

Me gustaría encontrar cuántas veces se duplicó ‘123’, cuántas veces se duplicó ‘234’, etc. Así que idealmente, la salida sería como:

 123 3 234 2 345 1 

Suponiendo que hay un número por línea:

 sort  | uniq -c 

Puede usar la bandera más detallada --count también con la versión de GNU, por ejemplo, en Linux:

 sort  | uniq --count 

Esto imprimirá líneas duplicadas solamente , 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 final se convierte en:

 sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr 

Para buscar y contar líneas duplicadas en varios archivos, puede probar el siguiente comando:

 sort  | uniq -c | sort -nr 

o:

 cat  | sort | uniq -c | sort -nr 

A través de awk :

 awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data 

En awk 'dups[$1]++' , la variable $1 contiene todo el contenido de la columna1 y los corchetes son acceso a la matriz. Por lo tanto, para cada primera columna de línea en data archivo de data , el nodo de la matriz llamada dups se incrementa.

Y al final, estamos haciendo un bucle sobre array dups con num como variable e imprimimos los números guardados primero y luego su número de valores duplicados por dups[num] .

Tenga en cuenta que su archivo de entrada tiene espacios al final de algunas líneas, si las borra, puede usar $0 en lugar de $1 en el comando anterior 🙂

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 

Asumiendo que tienes acceso a un entorno Unix shell o cygwin estándar:

 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 tranlsated y alimente eso a uniq y cuente las líneas duplicadas.

Si alguien está buscando el sitio web en línea que hace el trabajo similar:

http://www.kennistranslations.com/wordcount