Por que o comando uniq -c colocou um espaço em branco no início?

11

Eu tenho esse código em um script de shell:

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

O arquivo de entrada não tinha espaços em branco anteriores, mas a saída possui. Como faço para corrigir isso? Isso está no bash

Jeremy Wik
fonte

Respostas:

13

O comportamento padrão do uniq é justificar à direita a frequência em uma linha com 7 espaços de largura e separar a frequência do item com um único espaço.

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

Remova os espaços principais com sed:

$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output
Gounou
fonte
2
7 espaços, também conhecido como "pouco menos que uma guia".
chrylis -on strike-
Você pode separar com guias com algo parecido perl -pe 's/ *(\d+) /$1\t/'( aqui algumas alternativas ). Também canalize para a área de transferência com xclip -selection cpara colar diretamente em uma planilha.
Pablo Bianchi
5

uniq -cadiciona espaços em branco à esquerda. Por exemplo

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

Você pode adicionar um comando no final do pipeline para removê-lo. Por exemplo

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

FWIW, você pode usar uma ferramenta de classificação diferente para obter mais flexibilidade. Python é uma dessas ferramentas.

Fonte

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

Em teoria, isso seria ainda mais rápido do que a sortferramenta para grandes entradas, pois o programa acima usa uma tabela de hash para identificar linhas duplicadas em vez de uma lista classificada. (Infelizmente, ele coloca linhas de contagem idêntica em uma ordem arbitrária e não natural; isso pode ser alterado e ainda ser mais rápido que duas sortinvocações.)

Formato de saída

Se você quiser mais flexibilidade do formato de saída você pode olhar para o print()e format()funções embutidas.

Por exemplo, se você deseja imprimir o número da contagem em octal com até 7 zeros à esquerda e seguido por uma guia em vez de um caractere de espaço com um terminador de linha NUL, substitua a última linha por:

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

Uso

Armazene o script em um arquivo, digamos sort_count.py, e invoque-o com Python:

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

Traduza os espaços em branco à esquerda em um espaço em branco com tr -s e imprima a saída do segundo caractere com cut -c.

Ketan Gadwale
fonte
Sua solução comprimirá todas as ocorrências de seqüência de espaço em branco. Este é o efeito desejado.
Marc Vanhoomissen 7/03