Você pode substituir seu comando sed por um simples comando awk que troca a ordem dos campos
... | awk '{print ,}'
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
Você pode substituir seu comando sed por um simples comando awk que troca a ordem dos campos
... | awk '{print ,}'
Existem muitas maneiras de fazer isso. A Steeldriver já lhe deu a abordagem clássica de awk . Aqui estão algumas outras opções:
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+)/ /'
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]"'
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.
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).
Use o shell com seu pipeline original:
... | while read a b; do echo "$b $a"; done
Tags command-line sort