Comando o script Linux che conta le righe duplicate in un file di testo?


116

Se ho un file di testo con il seguente conent

red apple
green apple
green apple
orange
orange
orange

Esiste un comando o uno script Linux che posso utilizzare per ottenere il seguente risultato?

1 red apple
2 green apple
3 orange

Risposte:


214

Invia attraverso sort(per mettere insieme elementi adiacenti) quindi uniq -cper dare i conteggi, ad esempio:

sort filename | uniq -c

e per ottenere quell'elenco in ordine ordinato (per frequenza) puoi

sort filename | uniq -c | sort -nr

48

Quasi lo stesso di Borribles ma se aggiungi il dparametro uniqmostra solo i duplicati.

sort filename | uniq -cd | sort -nr

1
Complimenti per la piccola -dnota.
settembre

6

uniq -c file

e nel caso in cui il file non sia già ordinato:

sort file | uniq -c


3

Prova questo

cat myfile.txt| sort| uniq

senza i flag -c o -d, uniq non distingue le righe duplicate da quelle non duplicate o mi manca qualcosa?
drevicko


2

Riesci a convivere con un elenco alfabetico e ordinato:

echo "red apple
> green apple
> green apple
> orange
> orange
> orange
> " | sort -u 

?

green apple
orange
red apple

o

sort -u FILE

-u sta per unico e l'unicità viene raggiunta solo tramite l'ordinamento.

Una soluzione che preserva l'ordine:

echo "red apple
green apple
green apple
orange
orange
orange
" | { old=""; while read line ; do   if [[ $line != $old ]]; then  echo $line;   old=$line; fi ; done }
red apple
green apple
orange

e, con un file

cat file | { 
old=""
while read line
do
  if [[ $line != $old ]]
  then
    echo $line
    old=$line
  fi
done }

Gli ultimi due rimuovono solo i duplicati, che seguono immediatamente, il che si adatta al tuo esempio.

echo "red apple
green apple
lila banana
green apple
" ...

Stamperà due mele, divise da una banana.


0

Per ottenere solo un conteggio:

$> egrep -o '\w+' fruits.txt | sort | uniq -c

      3 apple
      2 green
      1 oragen
      2 orange
      1 red

Per ottenere un conteggio ordinato:

$> egrep -o '\w+' fruits.txt | sort | uniq -c | sort -nk1
      1 oragen
      1 red
      2 green
      2 orange
      3 apple

MODIFICARE

Aha, questo NON era lungo i confini delle parole, colpa mia. Ecco il comando da usare per le righe complete:

$> cat fruits.txt | sort | uniq -c | sort -nk1
      1 oragen
      1 red apple
      2 green apple
      2 orange

0

Ecco un semplice script Python che utilizza il tipo Counter . Il vantaggio è che ciò non richiede l'ordinamento del file, essenzialmente utilizzando memoria zero:

import collections
import fileinput
import json

print(json.dumps(collections.Counter(map(str.strip, fileinput.input())), indent=2))

Produzione:

$ cat filename | python3 script.py
{
  "red apple": 1,
  "green apple": 2,
  "orange": 3
}

oppure puoi usare un semplice one-liner:

$ cat filename | python3 -c 'print(__import__("json").dumps(__import__("collections").Counter(map(str.strip, __import__("fileinput").input())), indent=2))'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.