¿Comando o script de Linux que cuenta líneas duplicadas en un archivo de texto?

116

Si tengo un archivo de texto con el siguiente contenido

red apple
green apple
green apple
orange
orange
orange

¿Existe un comando o script de Linux que pueda usar para obtener el siguiente resultado?

1 red apple
2 green apple
3 orange
tiempo en
fuente

Respuestas:

215

Envíelo sort(para juntar los elementos adyacentes) y luego uniq -cpara contar, es decir:

sort filename | uniq -c

y para obtener esa lista en orden (por frecuencia) puede

sort filename | uniq -c | sort -nr
aburrido
fuente
48

Casi lo mismo que borribles ', pero si le agrega el dparámetro uniq, solo muestra duplicados.

sort filename | uniq -cd | sort -nr
Jaberino
fuente
1
Pulgares arriba por la pequeña -dnota.
septiembre
6

uniq -c file

y en caso de que el archivo aún no esté ordenado:

sort file | uniq -c

mhyfritz
fuente
3

Prueba esto

cat myfile.txt| sort| uniq
Rahul
fuente
sin los indicadores -co -d, uniq no distingue las líneas duplicadas de las no duplicadas, ¿o me falta algo?
drevicko
2
cat <filename> | sort | uniq -c
pajton
fuente
2

¿Puede vivir con una lista ordenada alfabéticamente:

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

?

green apple
orange
red apple

o

sort -u FILE

-u significa único, y la unicidad solo se alcanza mediante la clasificación.

Una solución que conserva el orden:

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

y, con un archivo

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

Los dos últimos solo eliminan los duplicados, que siguen de inmediato, lo que se ajusta a su ejemplo.

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

Imprimirá dos manzanas, partidas por un plátano.

usuario desconocido
fuente
0

Para obtener un recuento:

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

      3 apple
      2 green
      1 oragen
      2 orange
      1 red

Para obtener un recuento ordenado:

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

EDITAR

Ajá, esto NO fue dentro de los límites de las palabras, mi mal. Este es el comando que se debe usar para líneas completas:

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

Aquí hay una secuencia de comandos de Python simple que usa el tipo Counter . El beneficio es que esto no requiere ordenar el archivo, esencialmente usando memoria cero:

import collections
import fileinput
import json

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

Salida:

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

o puede usar un simple one-liner:

$ cat filename | python3 -c 'print(__import__("json").dumps(__import__("collections").Counter(map(str.strip, __import__("fileinput").input())), indent=2))'
orestisf
fuente