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