Compter les lignes et regrouper par mot de préfixe

Je veux compter le nombre de lignes dans un document et le regrouper par le mot de préfixe. Le préfixe est un ensemble de caractères alphanumériques délimités par le premier trait de soulignement. Je ne me soucie pas beaucoup de les sortinger, mais ce serait bien de les énumérer par nombre d’occurrences.

Le fichier ressemble à ceci:

prefix1_data1 prefix1_data2_a differentPrefix_data3 prefix1_data2_b differentPrefix_data5 prefix2_data4 differentPrefix_data5 

Le résultat doit être le suivant:

 prefix1 3 differentPrefix 3 prefix2 1 

Je l’ai déjà fait en python mais je suis curieux de savoir s’il est possible de le faire plus efficacement en utilisant la ligne de commande ou le script bash? uniq commande uniq a les options -c et -w mais la longueur du préfixe peut varier.

Vous pouvez utiliser awk :

 awk -F_ '{a[$1]++}END{for(i in a) print i,a[i]}' file 

Le séparateur de champs est défini sur _ .

Un tableau a est rempli de tous les premiers éléments, avec leur compte associé.

Lorsque le fichier est analysé, le contenu du tableau est imprimé

La solution utilisant la combinaison des commandes sed , sort et uniq :

 sed -rn 's/^([^_]+)_.*/\1/p' testfile | sort | uniq -c 

Le résultat:

 3 differentPrefix 3 prefix1 1 prefix2 

^([^_]+)_ – correspond à une sous-chaîne (préfixe, contenant tous les caractères sauf _ ) depuis le début de la chaîne jusqu’à la première occurrence du trait de soulignement _

J’aime la réponse de RomanPerekhrest. C’est plus concis. Voici un petit changement pour le rendre encore plus concis en utilisant cut in place of sed.

 cut -d_ -f1 testfile | sort | uniq -c 

Peut être fait de la manière suivante, le fichier de test est un fichier avec le contenu mentionné ci-dessus.

 printf %-20s%d"\n" prefix1 $(cat testfile|grep "^prefix1" | wc -l) printf %-20s%d"\n" differentPrefix $(cat testfile|grep "^differentPrefix" | wc -l) printf %-20s%d"\n" prefix2 $(cat testfile|grep "^prefix2" | wc -l) 

vous pouvez donc vérifier cela avec votre code et vérifier lequel est le plus efficace.