classificar pelo máximo das duas primeiras colunas

0

Eu tenho um arquivo que contém:

1 1 1 1 text1
7 9 4 2 text2
2 2 0.5 0.7 text3
5 4 1 2 text4

Eu quero classificá-lo (saída para o terminal) de acordo com o máximo das duas primeiras colunas.

resultado esperado:

1 1 1 1 text1
2 1 0.5 0.7 text3
5 4 1 2 text4
7 9 4 2 text2

como isso pode ser alcançado? obrigado!

    
por Nben 14.12.2016 / 13:10

4 respostas

2

Seu arquivo de entrada é:

1 1 1 1 text1
7 9 4 2 text2
2 2 0.5 0.7 text3
5 4 1 2 text4

Com essa entrada, um sort simples funcionará:

$ sort << EOF
> 1 1 1 1 text1
> 7 9 4 2 text2
> 2 2 0.5 0.7 text3
> 5 4 1 2 text4
> EOF
1 1 1 1 text1
2 2 0.5 0.7 text3
5 4 1 2 text4
7 9 4 2 text2

Se alterarmos a entrada para algo como ...

$ cat test.txt
1 3 1 1 text1
7 9 4 2 text2
2 1 0.5 0.7 text3
5 4 1 2 text4

Então a entrada se torna desafiadora. Um simples sort não funciona mais e podemos testar outras abordagens:

$ sort -k1,1n -k2,2n < test.txt
1 3 1 1 text1
2 1 0.5 0.7 text3
5 4 1 2 text4
7 9 4 2 text2

Este não é o que esperaríamos - As duas primeiras linhas de saída são invertidas - o valor mais alto da coluna 1/2 na linha 1 é "3" e o mais alto na linha 2 é "2".

O seguinte parece funcionar, pelo menos para o arquivo de entrada revisado, mas não é bonito (meu awk-fu é fraco):

$ awk '{ sorton=$1; if ($2>$1) { sorton=$2 }; print $1, $2, $3, $4, $5, sorton }' < test.txt | sort -k 6 | cut -d " " -f 1-5
2 1 0.5 0.7 text3
1 3 1 1 text1
5 4 1 2 text4
7 9 4 2 text2

@ Nominal-Animal e @JJoao sugeriram refinamentos, resultando em:

$ awk '{ k= $1>$2 ? $1: $2 ; print k, $0 }' test.txt | sort -g | cut -d ' ' -f 2-
2 1 0.5 0.7 text3
1 3 1 1 text1
5 4 1 2 text4
7 9 4 2 text2

(Sinta-se à vontade para editar esta postagem para refinar uma solução awk .)

    
por 14.12.2016 / 13:51
0

Para ordenação numérica nas duas primeiras colunas

sort -n -t " " -k1,1 -k2,2 /path/to/file
    
por 14.12.2016 / 13:23
0

Você pode fazer isso com o GNU sort :

sort -k1,1n -k2,2n yourfile
  • -k para especificar a coluna
por 14.12.2016 / 13:12
0

Se você tem o GNU awk (gawk) como seu awk, você pode usar sua função asort() para fazer tudo dentro do próprio awk:

{
  max = $1 > $2 ? $1 : $2;
  if (max in lines)
    lines[max] = lines[max] ORS $0
  else
    lines[max] = $0
}

END {
  asort(lines, lines, "@ind_num_asc")
  for(i=1; i<=length(lines); i++) { print lines[i] }
}
    
por 14.12.2016 / 18:35