Saída de coluna reversa com comando sort

3

Eu tenho que ordenar todas as palavras de um arquivo dado como parâmetro em um script de shell. Aqui está o one-liner:

tr  [:space:] '\n' <  | sort -nrk2,2 | uniq -c |sed 's/^ \+//g'

Basicamente, se eu tiver algo assim no meu arquivo:

bla bla bla bla hu hu hu

Ele produzirá

4 bla
3 hu

Eu quero que eles sejam algo como

bla 4
hu 3
    
por gigiman 16.01.2016 / 17:11

2 respostas

4

Você pode substituir seu comando sed por um simples comando awk que troca a ordem dos campos

... | awk '{print ,}'
    
por steeldriver 16.01.2016 / 17:18
6

Existem muitas maneiras de fazer isso. A Steeldriver já lhe deu a abordagem clássica de awk . Aqui estão algumas outras opções:

  1. Use sed para capturar dois grupos de caracteres que não sejam espaços em branco ( \S ) e, em seguida, alterne-os:

    ... | sed -E 's/\s*(\S+)\s+(\S+)/ /'
    
  2. Use perl . Sua opção -a faz com que funcione como awk . Ele dividirá automaticamente cada linha de entrada no espaço em branco e salvará cada campo como um elemento da matriz @F . Portanto, o primeiro campo será $F[0] , o segundo $F[1] etc .:

    ... | perl -lane 'print "$F[1] $F[0]"'
    
  3. Use Perl para a coisa toda:

    perl -lane '$k{$_}++ for @F; }{ print "$_ $k{$_}" for keys(%k)' ""
    

    Aqui, perl lê o arquivo de entrada linha a linha e aplica o script a cada linha. $k{$_}++ for @F salva cada palavra (cada campo de @F ) como uma chave no hash %k e incrementa o valor associado em um a cada vez que a palavra é vista. Então, depois que o arquivo tiver sido processado (é o que significa }{ ), ele imprimirá a palavra ( $_ ) e o número de vezes que ela foi visualizada ( $k{$_} ) para cada chave armazenada no hash.

  4. Use awk para a coisa toda:

    awk '{for(i=1;i<=NF;i++){a[$i]++}}END{for(i in a){print i,a[i]}}' ""
    

    O primeiro loop for passa por cima de cada campo e adiciona um ao valor associado a esse campo no array a . Em seguida, no final do arquivo, ele percorre cada elemento em a e imprime o elemento (a palavra) e o valor associado (o número de vezes que a palavra foi vista).

  5. Use o shell com seu pipeline original:

    ... | while read a b; do echo "$b $a"; done
    
por terdon 16.01.2016 / 17:59