J'ai ce code dans un script shell:
sort input | uniq -c | sort -nr > output
Le fichier d'entrée n'avait pas d'espaces blancs précédents, mais la sortie en contient. Comment puis-je réparer ça? C'est en bash
Le comportement par défaut de uniq consiste à justifier la fréquence sur une ligne large de 7 espaces, puis à séparer la fréquence de l'élément avec un seul espace.
Source: https://www.thelinuxrain.com/articles/tweaking-uniq-c
Supprimez les espaces de début avec sed:
$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output
uniq -c
ajoute des espaces de début. Par exemple.
$ echo test
test
$ echo test | uniq -c
1 test
Vous pouvez ajouter une commande à la fin du pipeline pour la supprimer. Par exemple.
$ echo test | uniq -c | sed 's/^\s*//'
1 test
FWIW, vous pouvez utiliser un outil de tri différent pour plus de flexibilité. Python est l'un de ces outils.
#!/usr/bin/python3
import sys, operator, collections
counter = collections.Counter(map(operator.methodcaller('rstrip', '\n'), sys.stdin))
for item, count in counter.most_common():
print(count, item)
En théorie, cela serait même plus rapide que l'outil sort
pour les entrées volumineuses, car le programme ci-dessus utilise une table de hachage pour identifier les lignes en double au lieu d'une liste triée. (Hélas, les lignes de même nombre sont placées dans un ordre arbitraire au lieu d'un ordre naturel; cela peut être modifié et toujours plus rapide que deux invocations sort
.)
Si vous voulez plus de flexibilité sur le format de sortie, vous pouvez vous pencher sur les fonctions intégrées print()
et format()
.
Par exemple, si vous souhaitez imprimer le nombre de comptage en octal avec un maximum de 7 zéros et suivi d'un onglet au lieu d'un caractère d'espacement avec un séparateur de ligne NUL, remplacez la dernière ligne par:
print(format(count, '08o'), item, sep='\t', end='\0')
Stockez le script dans un fichier, dites sort_count.py
, et appelez-le avec Python:
python3 sort_count.py < input