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 a. Comment puis-je réparer ça? C'est en bash
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 a. Comment puis-je réparer ça? C'est en bash
Réponses:
Le comportement par défaut de uniq est de justifier à droite la fréquence dans une ligne de 7 espaces, puis de séparer la fréquence de l'élément avec un seul espace.
Source: https://www.thelinuxrain.com/articles/tweaking-uniq-c
Supprimez les principaux espaces avec sed:
$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output
perl -pe 's/ *(\d+) /$1\t/'
( ici quelques alternatives ). Pipes également au presse-papiers avec xclip -selection c
pour coller directement dans une feuille de calcul.
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' sort
outil pour les grandes entrées, 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, il place des lignes de nombre identique dans un ordre arbitraire au lieu d'un ordre naturel; cela peut être modifié et toujours plus rapide que deux sort
invocations.)
Si vous voulez plus de flexibilité sur le format de sortie , vous pouvez regarder dans le print()
et les format()
fonctions intégrées.
Par exemple, si vous souhaitez imprimer le nombre de décomptes en octal avec jusqu'à 7 zéros de tête et suivi d'un onglet au lieu d'un caractère espace avec un terminateur de ligne NUL, remplacez la dernière ligne par:
print(format(count, '08o'), item, sep='\t', end='\0')
Stockez le script dans un fichier, par exemple sort_count.py
, et invoquez-le avec Python:
python3 sort_count.py < input
uniq -c -i | tr -s ' ' | cut -c 2-
Traduisez les espaces blancs de tête en espaces blancs simples avec tr -s, puis imprimez la sortie du 2ème caractère avec cut -c.