Supponiamo di avere un file simile al seguente:
123
123
234
234
123
345
Vorrei scoprire quante volte '123' è stato duplicato, quante volte è stato duplicato '234', ecc. Quindi idealmente, l'output sarebbe come:
123 3
234 2
345 1
Supponiamo di avere un file simile al seguente:
123
123
234
234
123
345
Vorrei scoprire quante volte '123' è stato duplicato, quante volte è stato duplicato '234', ecc. Quindi idealmente, l'output sarebbe come:
123 3
234 2
345 1
Risposte:
Supponendo che ci sia un numero per riga:
sort <file> | uniq -c
Puoi usare anche il --count
flag più dettagliato con la versione GNU, ad esempio su Linux:
sort <file> | uniq --count
sort
nuovo come:sort <file> | uniq -c | sort -n
Questo stamperà solo righe duplicate , con conteggi:
sort FILE | uniq -cd
oppure, con le opzioni GNU long (su Linux):
sort FILE | uniq --count --repeated
su BSD e OSX devi usare grep per filtrare le linee uniche:
sort FILE | uniq -c | grep -v '^ *1 '
Per l'esempio fornito, il risultato sarebbe:
3 123
2 234
Se si desidera stampare i conteggi per tutte le righe, comprese quelle visualizzate una sola volta:
sort FILE | uniq -c
oppure, con le opzioni GNU long (su Linux):
sort FILE | uniq --count
Per l'input specificato, l'output è:
3 123
2 234
1 345
Per ordinare l'output con le righe più frequenti in alto, puoi fare quanto segue (per ottenere tutti i risultati):
sort FILE | uniq -c | sort -nr
oppure, per ottenere solo righe duplicate, prima le più frequenti:
sort FILE | uniq -cd | sort -nr
su OSX e BSD l'ultimo diventa:
sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
| sort -n
o | sort -nr
alla pipe ordina l'output in base al conteggio delle ripetizioni (rispettivamente crescente o decrescente). Non è quello che stai chiedendo, ma ho pensato che potesse aiutare.
| awk '$1>100'
sort FILE | uniq -c | grep -v '^ *1 '
attraverso awk:
awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data
Al awk 'dups[$1]++'
comando, la variabile $1
contiene l'intero contenuto di column1 e le parentesi quadre sono l'accesso alla matrice. Pertanto, per ogni prima colonna della riga nel data
file, il nodo dell'array denominato dups
viene incrementato.
E alla fine, eseguiamo il looping dups
sull'array con num
come variabile e stampiamo prima i numeri salvati , quindi il loro numero di valore duplicato dups[num]
.
Si noti che il file di input ha spazi alla fine di alcune righe, se si cancellano quelli, è possibile utilizzare $0
al posto del $1
comando sopra :)
uniq
?
sort | uniq
e la soluzione awk presenta compromessi di prestazioni e risorse piuttosto diversi: se i file sono grandi e il numero di righe diverse è piccolo, la soluzione awk è molto più efficiente. È lineare nel numero di linee e l'utilizzo dello spazio è lineare nel numero di linee diverse. OTOH, la soluzione awk deve conservare tutte le diverse linee in memoria, mentre l'ordinamento (GNU) può ricorrere a file temporanei.
In Windows usando "Windows PowerShell" ho usato il comando menzionato di seguito per raggiungere questo obiettivo
Get-Content .\file.txt | Group-Object | Select Name, Count
Inoltre possiamo usare il cmdlet where-object per filtrare il risultato
Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count
Supponendo di avere accesso a una shell Unix standard e / o all'ambiente cygwin:
tr -s ' ' '\n' < yourfile | sort | uniq -d -c
^--space char
Fondamentalmente: converti tutti i caratteri dello spazio in interruzioni di riga, quindi ordina l'output tradotto e alimentalo in uniq e conta le righe duplicate.