Pourquoi la commande uniq -c a-t-elle mis un espace au début?

11

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

Jeremy Wik
la source

Réponses:

13

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
Gounou
la source
2
7 espaces, alias "un peu moins qu'une tabulation".
chrylis -on strike-
Vous pouvez ensuite séparer avec des onglets avec quelque chose comme perl -pe 's/ *(\d+) /$1\t/'( ici quelques alternatives ). Pipes également au presse-papiers avec xclip -selection cpour coller directement dans une feuille de calcul.
Pablo Bianchi
5

uniq -cajoute un espace blanc de premier plan. 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
wjandrea
la source
1

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' sortoutil 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 sortinvocations.)

Format de sortie

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

Usage

Stockez le script dans un fichier, par exemple sort_count.py, et invoquez-le avec Python:

python3 sort_count.py < input
David Foerster
la source
0
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.

Ketan Gadwale
la source
Votre solution compressera toutes les occurrences de la séquence d'espaces. C'est l'effet recherché.
Marc Vanhoomissen