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
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
Respostas:
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
perl -pe 's/ *(\d+) /$1\t/'
( aqui algumas alternativas ). Também canalize para a área de transferência com xclip -selection c
para colar diretamente em uma planilha.
FWIW, você pode usar uma ferramenta de classificação diferente para obter mais flexibilidade. Python é uma dessas ferramentas.
#!/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 sort
ferramenta 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 sort
invocações.)
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')
Armazene o script em um arquivo, digamos sort_count.py
, e invoque-o com Python:
python3 sort_count.py < input
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.