2011-06-22 26 views
84

Si tengo un archivo de texto con el siguiente conentComando Linux o script que cuenta líneas duplicadas en un archivo de texto?

red apple 
green apple 
green apple 
orange 
orange 
orange 

¿Hay un comando o secuencia de comandos de Linux que puedo utilizar para obtener el siguiente resultado?

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

:

1 red apple 
2 green apple 
3 orange 

Respuesta

161

enviarlo a través sort (a incluir puntos adyacentes) luego uniq -c para dar el recuento, es decir:

sort filename | uniq -c 

y para conseguir esa lista en el orden establecido (por frecuencia) Puede

sort filename | uniq -c | sort -nr 
2

Se puede vivir con un alfabético, lista ordenada?

green apple 
orange 
red apple 

o

sort -u FILE 

-u significa único, y la singularidad solamente se alcanza a través de la clasificación.

Una solución que preserve 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 sólo eliminan los duplicados, que siguen de inmediato - que se ajusta a tu ejemplo.

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

Se imprimirán dos manzanas, divididas por un plátano.

6

uniq -c file

y en caso de que el archivo no está ordenada ya:

sort file | uniq -c

1
cat <filename> | sort | uniq -c 
3

probar este

cat myfile.txt| sort| uniq 
+0

sin -c ni -d flags, uniq no distingue las líneas duplicadas de las no duplicadas, ¿o me falta algo? – drevicko

0

para obtener sólo un recuento:

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

     3 apple 
     2 green 
     1 oragen 
     2 orange 
     1 red 

Para llegar un recuento ordenado:

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

EDITAR

Aha, esto NO fue a lo largo de los límites de palabras, mi mal.Aquí está el comando a utilizar para líneas completas:

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

casi lo mismo que borribles' pero si se agrega el parámetro d a uniq sólo muestra los duplicados.

sort filename | uniq -cd | sort -nr 
+1

Thumbs up para la pequeña nota '-d'. – sepehr

Cuestiones relacionadas