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

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

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

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

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.


Votre solution compressera toutes les occurrences de la séquence d'espaces. C'est l'effet recherché.
Marc Vanhoomissen
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.