Obtenez les lignes les plus courantes à partir d'un fichier sous Linux

11

J'ai un fichier texte qui contient plusieurs mots par ligne.
Comment puis-je trouver les 12 lignes les plus fréquentes dans le fichier et les afficher?
Je ne suis pas très bon avec les commandes de script.

Si je pouvais obtenir la commande et une explication afin que je puisse comprendre comment l'utiliser et développer mes connaissances sur les commandes, ce serait génial!

Jim
la source
stackoverflow.com/questions/16922357/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Réponses:

21

Vous pouvez facilement le faire avec des commandes intégrées.

  • Alimentez le contenu du fichier sort. Nous en avons besoin pour la prochaine étape.
  • Cela va à uniq -c. Il comptera l'occurrence unique de chaque ligne. Si les lignes similaires ne sont pas adjacentes, cela n'aurait pas fonctionné sans tri avant.
  • Ensuite, alimentez-le à un autre sort, qui trie maintenant dans l'ordre inversé ( r) et basé sur l' ninterprétation numérique ( ) de la uniqsortie. Nous avons besoin de l'option numérique car sinon, l'espace devant les chiffres conduirait à des résultats erronés (voir l'aide de GNUsort pour plus).
  • Enfin, affichez uniquement les douze premières lignes avec head.

La commande serait alors:

sort test.txt | uniq -c | sort -rn | head -n 12

La sortie ici contient le nombre réel d'occurrences.

Pour obtenir uniquement la liste brute des lignes, vous pouvez diriger la sortie vers sed:

sort test.txt | uniq -c | sort -rn | head -n 12 | sed -E 's/^ *[0-9]+ //g'

Exemple:

I'm not there very often
I'm not there very often
Look at me!
Look at me!
Look at me!
Hello there!
Hello there!
Hello there!
Hello there!
Hello there!
Hello there!

Sortie de la première commande, mais en sélectionnant seulement 2 parmi head:

6 Hello there!
3 Look at me!

Sortie de la deuxième commande:

Hello there!
Look at me!
slhck
la source
1
Vous devez le trier avant de l'utiliser uniq.
cYrus
@slhck: Merci! Une question: Les sort -rntris dans l'ordre inverse en utilisant comme champ de tri le numéro à côté de chaque ligne produite par uniq -c? Je pensais que quelque chose comme k1ou quelque chose comme ça serait utilisé
Jim
@Jim Exactement. rinverse et ntrie numériquement le nombre produit par uniq. Que voulez-vous dire exactement k1?
slhck
@slhck: J'essayais de comprendre ces commandes en utilisant manet j'ai compris qu'une syntaxe utilisant -kquelque chose devait être utilisée pour choisir le champ à trier
Jim
@cYrus: Quel est le cas de bord qu'un tri est nécessaire au préalable?
Jim
3

Si votre distribution a un logtop

cat your_file | logtop

Si votre fichier est en constante augmentation, comme un fichier journal, essayez:

tail -f your_log | logtop
Julien Palard
la source