¿Por qué el comando uniq -c puso un espacio en blanco al principio?

11

Tengo este código en un script de shell:

sort input | uniq -c | sort -nr > output

El archivo de entrada no tenía espacios en blanco anteriores, pero la salida sí. ¿Cómo puedo solucionar esto? Esto es en bash

Jeremy Wik
fuente

Respuestas:

13

El comportamiento predeterminado de uniq es justificar a la derecha la frecuencia en una línea de 7 espacios de ancho, luego separar la frecuencia del elemento con un solo espacio.

Fuente: https://www.thelinuxrain.com/articles/tweaking-uniq-c

Elimine los espacios iniciales con sed:

$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output
Gounou
fuente
2
7 espacios, también conocidos como "solo menos de una pestaña".
chrylis -on strike-
Luego puede separar con pestañas con algo como perl -pe 's/ *(\d+) /$1\t/'( aquí algunas alternativas ). También canalice al portapapeles con xclip -selection cpara pegar directamente en una hoja de cálculo.
Pablo Bianchi
5

uniq -cagrega espacios en blanco principales. P.ej

$ echo test
test
$ echo test | uniq -c
      1 test

Puede agregar un comando al final de la tubería para eliminarlo. P.ej

$ echo test | uniq -c | sed 's/^\s*//'
1 test
wjandrea
fuente
1

FWIW puede usar una herramienta de clasificación diferente para mayor flexibilidad. Python es una de esas herramientas.

Fuente

#!/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 teoría, esto sería incluso más rápido que la sortherramienta para entradas grandes, ya que el programa anterior usa una tabla hash para identificar líneas duplicadas en lugar de una lista ordenada. (Por desgracia, coloca líneas de recuento idéntico en un orden arbitrario en lugar de un orden natural; esto puede modificarse y aún así ser más rápido que dos sortinvocaciones).

Formato de salida

Si desea más flexibilidad en el formato de salida se puede mirar en el print()y format()funciones integradas.

Por ejemplo, si desea imprimir el número de recuento en octal con hasta 7 ceros a la izquierda y seguido de una pestaña en lugar de un carácter de espacio con un terminador de línea NUL, reemplace la última línea con:

    print(format(count, '08o'), item, sep='\t', end='\0')

Uso

Almacene el script en un archivo, por ejemplo sort_count.py, e invoque con Python:

python3 sort_count.py < input
David Foerster
fuente
0
uniq -c -i | tr -s ' ' | cut -c 2-

Traduce los espacios en blanco iniciales en un espacio en blanco con tr -s y luego imprime la salida del segundo carácter con cut -c.

Ketan Gadwale
fuente
Su solución exprimirá todas las ocurrencias de la secuencia de espacios en blanco. Este es el efecto deseado.
Marc Vanhoomissen