Como canalizar para classificar?

1

Estou com problemas para tentar falar com um gawk. Atualmente tenho:

gawk -f p3a01.awk unsortedNames.txt | sort | gawk -f p3a01.awk

isso, no entanto, está me dando resultados errados. O gawk parece funcionar bem se eu fizer algo como:

gawk -f p3a01.awk unsortedNames.txt | sort > test1.out
gawk -f p3a01.awk test1.out

Não tenho certeza se existe uma maneira correta de direcionar a classificação para o gawk. Eu gostaria idealmente de fazer isso tudo em uma linha

Snip de unsortedNames.txt :

Faye King
Lenny R Graph
I M Board
Grey White

p3a01.awk (imprime o sobrenome primeiro e depois o restante do nome):

BEGIN{}
{
      printf $NF " ";
      $NF="";
      print $0;
}
END{}

p3a02.awk (imprime o arquivo na ordem original depois de ter sido encomendado pelo sobrenome):

BEGIN{}
{
     for(i=2;i<=NF;i++){
         printf $i " ";
     }
     print $1;
}
END{}

Resultado final (classificado pelo sobrenome):

I M Board
Lenny R Graph
Faye King
Grey White
    
por below_avg_st 28.09.2017 / 08:03

2 respostas

1

Solução single-processada GNU Awk :

awk 'BEGIN{ PROCINFO["sorted_in"]="@ind_str_asc" }
     { a[$NF]=$0 }END{ for(i in a) print a[i] }' unsortedNames.txt
  • PROCINFO["sorted_in"]="@ind_str_asc" - comparação / classificação por chaves / índices do array. Podemos definir a matriz predefinida PROCINFO para um de um conjunto de valores predefinidos. Esses valores especiais descritos aqui (documentação): link

A saída:

I M Board
Lenny R Graph
Faye King
Grey White
    
por 28.09.2017 / 08:26
0

Seu código parece estar funcionando como anunciado, então, quaisquer erros que você esteja enfrentando podem estar relacionados a caracteres invisíveis nos dados de entrada ( \r no final das linhas?).

Percebi que você está removendo o último campo quando está transformando os dados de sort . Isso não é necessário. Você só precisa prefixar cada linha com o último campo e, em seguida, removê-lo novamente após o sort :

$ awk '{ print $NF, $0 }' file | sort | cut -d ' ' -f 2-
I M Board
Lenny R Graph
Faye King
Grey White

O comando cut produzirá todos os campos delimitados por espaços a partir do segundo.

    
por 28.09.2017 / 09:12

Tags