web-dev-qa-db-fra.com

Pourquoi cette commande a-t-elle mis un espace au début?

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

9
Jeremy Wik

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
12
Gounou

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
5
wjandrea

FWIW, vous pouvez utiliser un outil de tri différent pour plus de flexibilité. Python est l'un de ces outils.

La source

#!/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.)

Format de sortie

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')

Usage

Stockez le script dans un fichier, dites sort_count.py, et appelez-le avec Python:

python3 sort_count.py < input
1
David Foerster