Agrupando registros usando shell

2

É possível transformar isso:

1 Alice
1 Bob
1 Cary
2 Dan
3 Eve
3 Fred 

para isso:

1 Alice,Bob,Cary
2 Dan
3 Eve,Fred

usando o shell? (sem Perl, Ruby, Python, etc)

    
por synapse 30.03.2011 / 08:17

4 respostas

2

Sim, há algumas maneiras de fazer isso.

Sort é seu amigo: Ordenar Wiki .

Como é o Awk : Awk Howto .

    
por 30.03.2011 / 08:25
2

Usando matrizes associativas na versão 4 do bash:

declare -A ary
while read line; do
  set -- $line
  ary[$1]+="$2,"
done < input_file
for key in ${!ary[@]}; do
  printf "%s %s\n" $key ${ary[$key]%,}  # the "%," strips the trailing comma
done
    
por 30.03.2011 / 12:40
1

Porcaria, eu não pude resistir ao desafio. Aqui está minha solução no shell (bash para ser exato) como um oneliner:

k=0; while read i j; do if [ $k -eq $i ]; then echo -n ",$j"; \
else [ $k -gt 0 ] && echo; echo -n "$i $j"; k=$i; fi; done \
</tmp/infile; echo

que produz a saída desejada, formatada corretamente:

1 Alice,Bob,Cary
2 Dan
3 Eve,Fred

Suposições:

  1. 0 não é uma entrada válida na primeira coluna dos dados.
  2. a primeira coluna já está numericamente ordenada.

Se # 2 não é válido, você precisa executar a entrada através de sort(1) primeiro com uma classificação numérica para colocá-la na ordem correta.

Se eu descobrir que acabei de responder ao seu dever de casa, ficarei extremamente irritado. Meu único consolo é que, se o seu professor vir o que eu escrevi, eles pensarão que você é louco.

    
por 30.03.2011 / 10:30
0

Esse aqui no stackoverflow é muito parecido e tem algumas boas respostas: link

    
por 30.03.2011 / 10:31

Tags