Commande ou script Linux comptant les lignes dupliquées dans un fichier texte?

116

Si j'ai un fichier texte avec le contenu suivant

red apple
green apple
green apple
orange
orange
orange

Existe-t-il une commande ou un script Linux que je peux utiliser pour obtenir le résultat suivant?

1 red apple
2 green apple
3 orange
il est temps
la source

Réponses:

215

Envoyez-le sort(pour rassembler les éléments adjacents) puis uniq -cpour donner des comptes, c'est-à-dire:

sort filename | uniq -c

et pour obtenir cette liste par ordre trié (par fréquence), vous pouvez

sort filename | uniq -c | sort -nr
borrible
la source
48

Presque la même chose que les borribles 'mais si vous ajoutez le dparamètre, uniqil ne montre que les doublons.

sort filename | uniq -cd | sort -nr
Jaberino
la source
1
Bravo pour la petite -dnote.
sepehr
6

uniq -c file

et si le fichier n'est pas déjà trié:

sort file | uniq -c

mhyfritz
la source
3

Essaye ça

cat myfile.txt| sort| uniq
Rahul
la source
sans les indicateurs -c ou -d, uniq ne distingue pas les lignes en double des non-doublons, ou est-ce que je manque quelque chose?
drevicko
2
cat <filename> | sort | uniq -c
Pajton
la source
2

Pouvez-vous vivre avec une liste alphabétique et ordonnée:

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

?

green apple
orange
red apple

ou

sort -u FILE

-u signifie unique et l'unicité n'est atteinte que par le tri.

Une solution qui préserve la commande:

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

et, avec un fichier

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

Les deux derniers suppriment uniquement les doublons, qui suivent immédiatement - ce qui correspond à votre exemple.

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

Imprime deux pommes, fendues par une banane.

Utilisateur inconnu
la source
0

Pour juste obtenir un compte:

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

      3 apple
      2 green
      1 oragen
      2 orange
      1 red

Pour obtenir un décompte trié:

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

ÉDITER

Aha, ce n'était PAS le long des limites des mots, mon mal. Voici la commande à utiliser pour les lignes complètes:

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

Voici un simple script python utilisant le type Counter . L'avantage est que cela ne nécessite pas de trier le fichier, en utilisant essentiellement zéro mémoire:

import collections
import fileinput
import json

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

Production:

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

ou vous pouvez utiliser un simple one-liner:

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