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
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
Respuestas:
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
perl -pe 's/ *(\d+) /$1\t/'
( aquí algunas alternativas ). También canalice al portapapeles con xclip -selection c
para pegar directamente en una hoja de cálculo.
FWIW puede usar una herramienta de clasificación diferente para mayor flexibilidad. Python es una de esas herramientas.
#!/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 sort
herramienta 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 sort
invocaciones).
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')
Almacene el script en un archivo, por ejemplo sort_count.py
, e invoque con Python:
python3 sort_count.py < input
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.